【问题标题】:Emgu CV make transparent backgroundEmgu CV制作透明背景
【发布时间】: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


【解决方案1】:

如果您的字节数组是 PNG 文件中的所有数据,那么图像尺寸和颜色深度都只是该文件标题数据的一部分,您不需要做任何特殊的一点也不。你为什么还要使用Image&lt;Rgba, byte&gt;?最后你似乎希望它为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

【讨论】:

  • 谢谢。但我的任务是保存 png 文件的原始颜色深度。
  • 你从来没有这么说过。您只说过您想保留透明度,我编辑了问题并将您链接到我在这里给出的其他一些关于保留原始图像格式的答案。这应该可以解决您的问题。
  • @VladiSlav 如果答案帮助您解决了问题,请accept it as answer
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2020-03-18
相关资源
最近更新 更多