我需要在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
会破坏图像。
解决方案:
由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