Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Image from byte array

Tags:

image

vb.net

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
like image 779
Marco Avatar asked Jun 06 '26 02:06

Marco


1 Answers

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
like image 107
Steven Doggart Avatar answered Jun 08 '26 00:06

Steven Doggart



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!