我仍在学习Emgu CV,我需要从包含PNG32数据的字节数组中加载Image。我正在按以下方式加载图像(这是工作示例):
FileStream fs;
Bitmap bitmap;
Image<Rgba, byte> image;
bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);
image = new Image<Rgba, byte>(width, height)
{
Bytes = data // data is my byte array
};
if(File.Exists("1.png"))
File.Delete("1.png");
image.Save("1.png");
fs = new FileStream("1.png", FileMode.Open);
bitmap = (Bitmap)Image.FromStream(fs); // this is image what I need
fs.Close();
File.Delete("1.png");
因为我只用
Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);
Image<Rgba, byte> image = new Image<Rgba, byte>(width, height)
{
Bytes = data // data is my byte array
};
bitmap = image.Bitmap; // this is image what I need
位图的背景将是白色,但是我的初始图像具有透明背景。
因此,我认为从二进制数据中加载Image的最佳方法比第一个示例更好,但我不知道。有人可以帮忙吗?
答案 0 :(得分:1)
如果字节数组是PNG文件中的所有数据,则图像尺寸和颜色深度都只是该文件头数据的一部分,并且您无需执行任何特殊操作完全没有您为什么还要使用那个Image<Rgba, byte>
?您似乎最终希望将其作为Bitmap
……因此直接将其作为Bitmap
加载:
Bitmap bitmap;
using (MemoryStream ms = new MemoryStream(data))
using (Bitmap tmp = new Bitmap(ms))
bitmap = new Bitmap(tmp);
那应该是您唯一需要的代码。最后的new Bitmap(tmp)
将创建一个新对象,该对象不与附加了tmp
的流绑定,从而使该对象在没有the previously mentioned issues concerning disposed streams的情况下可用。此外,从现有Bitmap
制作新的Bitmap
时,结果始终是32bpp ARGB。
如果要保留原始颜色深度,可以将new Bitmap(tmp);
替换为the CloneImage function I described here。
如果您的文件包括包含透明度的8位PNG文件,则System.Drawing
类出于某种原因会将它们转换为32位ARGB。要解决此问题,请查看this answer I gave to a question on that subject。