【发布时间】:2019-02-13 10:50:09
【问题描述】:
我仍在学习 Emgu CV,我需要从包含 PNG32 数据的字节数组加载图像。我正在按如下方式加载图像(这是工作示例):
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
我的位图的背景是白色的,但是我的初始图像具有透明背景。
所以,我认为从二进制数据加载图像的方法比我的第一个示例更优化,但我不知道。有人可以帮忙吗?
【问题讨论】:
-
原始代码已经很糟糕了...根据 MSDN 规范,Bitmaps created from stream need that stream to remain open for the lifetime of the image. 在处理流后使用该图像通常会导致崩溃。
-
“PNG32 数据”到底是什么意思?它只是一个PNG文件吗?如果是这样,您可以从中创建一个
MemoryStream,然后在其上使用new Bitmap(stream)构造函数: -
在相关说明中...为什么要使用新位图初始化
bitmap变量?该对象完全未使用。 -
@Nyerguds,如您所知(我希望),PNG 文件可能有三种格式:8 位(索引图像)、24 位(不透明图像)和 32 位。 “PNG32”的意思是,对于我的图像的每个像素,二进制数据具有一个红色字节、一个绿色字节、一个蓝色字节和一个 alpha 字节,即我的图像是 32 位的。使用 MemoryStream 会导致错误 - 它无法正确读取数据。
-
@Nyerguds,我用新的位图初始化位图变量,因为我需要指定图像的 PixelFormat。
标签: c# opencv transparency emgucv binary-data