I need to render an image in an ObjectListView column, so I set an ImageRenderer that accepts a byte array and use this code to change it into an image
image = Image.FromStream(stream);
That said, I need to extract an icon from an exe file, convert it into a byte array so that ObjectListView can render it.
Here is the code I use:
Using ms = New MemoryStream()
Dim imageIn = Icon.ExtractAssociatedIcon(exe_path)
imageIn.Save(ms)
Return ms.ToArray()
End Using
Problem is that image is rendered with wrong colors (like if it was 8bpp).
So I tried to use this code to find the problem:
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
In this scenario, img1.bmp is correct (bitmap with real colors), while img2.bmp has wrong colors; so either ms.ToArray() or Image.FromStream corrupt the image.
SOLUTION:
Solution given by Steven Doggart solves problem of colors, but rendered image is not "transparent".
A possible solution is making the bitmap transparent and passing a PNG format to the array
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
The problem is that you are saving an Icon to a byte array, but then you are loading it from that byte array directly into an Image. Icon objects are not stored in the same byte-array format as Image objects. Icon objects can contain multiple images of different sizes and color depths whereas Image objects can only contain one. Also, Icon objects accept the alpha channel (transparency) whereas Image objects do not.
When you save the Icon to the byte array, you should first extract the desired bitmap from it, like this:
Using ms = New MemoryStream()
Dim imageIn = Icon.ExtractAssociatedIcon(exe_path)
imageIn.ToBitmap().Save(ms, ImageFormat.Bmp)
Return ms.ToArray()
End Using
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With