来自字节数组的图像

时间:2014-02-26 15:44:01

标签: vb.net image

我需要在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

1 个答案:

答案 0 :(得分:2)

问题是您要将Icon保存到字节数组,但是然后将它从该字节数组直接加载到ImageIcon个对象不以与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