我需要在ObjectListView
列中渲染图像,因此我设置了一个接受字节数组的ImageRenderer
并使用此代码将其更改为图像
image = Image.FromStream(stream);
也就是说,我需要从exe文件中提取一个图标,将其转换为字节数组,以便ObjectListView
可以呈现它。
这是我使用的代码:
Using ms = New MemoryStream()
Dim imageIn = Icon.ExtractAssociatedIcon(exe_path)
imageIn.Save(ms)
Return ms.ToArray()
End Using
问题是图像呈现的颜色错误(如果是8bpp) 所以我尝试使用此代码来查找问题:
Using ms = New MemoryStream()
Dim imageIn = Icon.ExtractAssociatedIcon(exe_path)
imageIn.Save(ms)
Dim bmp = imageIn.ToBitmap()
bmp.Save("img1.bmp")
Using mt As New MemoryStream(ms.ToArray())
Dim img = Image.FromStream(mt)
img.Save("img2.bmp")
End Using
End Using
在这种情况下,img1.bmp
是正确的(具有真实颜色的位图),而img2.bmp
的颜色错误;因此,ms.ToArray()
或Image.FromStream
会损坏图像。
SOLUTION:
Steven Doggart给出的解决方案解决了颜色问题,但渲染图像并非“透明”
一种可能的解决方案是使位图透明并将PNG格式传递给数组
Using ms = New MemoryStream()
Dim bmp = Icon.ExtractAssociatedIcon(exe_path).ToBitmap()
bmp.MakeTransparent(bmp.GetPixel(0, 0))
bmp.Save(ms, ImageFormat.Png)
Using mt As New MemoryStream(ms.ToArray())
Dim img = Image.FromStream(mt)
img.Save("img2.bmp")
End Using
End Using
答案 0 :(得分:2)
问题是您要将Icon
保存到字节数组,但是然后将它从该字节数组直接加载到Image
。 Icon
个对象不以与Image
个对象相同的字节数组格式存储。 Icon
个对象可以包含不同大小和颜色深度的多个图像,而Image
个对象只能包含一个。此外,Icon
个对象接受alpha通道(透明度),而Image
个对象不接受。
将Icon
保存到字节数组时,应首先从中提取所需的位图,如下所示:
Using ms = New MemoryStream()
Dim imageIn = Icon.ExtractAssociatedIcon(exe_path)
imageIn.ToBitmap().Save(ms, ImageFormat.Bmp)
Return ms.ToArray()
End Using