繁体   English   中英

Emgu CV制作透明背景

[英]Emgu CV make transparent background

我仍在学习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

位图的背景将是白色,但是我的初始图像具有透明背景。

因此,我认为从二进制数据中加载图像的最佳方法比第一个示例更好,但我不知道。 有人可以帮忙吗?

如果您的字节数组是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附加到的流绑定,从而使该对象可用,而不会出现前面提到的有关已处理流的问题 此外,从现有Bitmap制作新Bitmap Bitmap ,结果始终为32bpp ARGB。

如果要保留原始的颜色深度,则可以替换new Bitmap(tmp); 通过我在这里描述的CloneImage函数

如果您的文件包括包含透明度的8位PNG文件,则出于某种原因, System.Drawing类会将它们转换为32位ARGB。 为了解决这个问题,请看一下我对这个问题提出的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM