gpt4 book ai didi

c# - Emgu CV制作透明背景

转载 作者:行者123 更新时间:2023-12-02 17:05:44 29 4
gpt4 key购买 nike

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

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

所以,我认为有比我的第一个示例更优化的从二进制数据加载图像的方法,但我不知道。任何人都可以帮忙吗?

最佳答案

如果您的字节数组是 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)最后将创建一个不绑定(bind)到 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 .

关于c# - Emgu CV制作透明背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54668406/

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