gpt4 book ai didi

vb.net - 来自字节数组的图像

转载 作者:行者123 更新时间:2023-12-01 14:37:45 25 4
gpt4 key购买 nike

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

最佳答案

问题是您将 Icon 保存到字节数组,但随后将它从该字节数组直接加载到 Image 中。 Icon 对象没有以与Image 对象相同的字节数组格式存储。 Icon 对象可以包含多个不同大小和颜色深度的图像,而 Image 对象只能包含一个。此外,Icon 对象接受 alpha channel (透明度),而 Image 对象不接受。

当您将Icon 保存到字节数组时,您应该首先从中提取所需的位图,如下所示:

Using ms = New MemoryStream()
Dim imageIn = Icon.ExtractAssociatedIcon(exe_path)
imageIn.ToBitmap().Save(ms, ImageFormat.Bmp)
Return ms.ToArray()
End Using

关于vb.net - 来自字节数组的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22046272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com