c# - Emgu CV制作透明背景
问题描述
我仍在学习 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)
将创建一个新对象,该对象不绑定到该tmp
对象所附加的流,从而使该对象可以在没有前面提到的有关已处理流的问题的情况下使用。此外,当Bitmap
从现有Bitmap
的 .
如果要保留原始颜色深度,可以用我在此处描述new Bitmap(tmp);
的CloneImage 函数替换。
如果您的文件包含包含透明度的 8 位 PNG 文件,则这些System.Drawing
类将出于某种原因将它们转换为 32 位 ARGB。要解决这个问题,请查看我对有关该主题的问题给出的答案。
推荐阅读
- docker - Azure DevOps Maven Docker 构建 - 找不到目标文件夹
- c# - 提取具有标签、管道和 6 个字符的字符串
- node.js - 找不到 Socket.io.js (404)
- java - 应用程序因 Unhandeled 异常而崩溃:适配器的内容已更改但 ListView 未收到通知
- android - 在 Android 中调用 .NET Web API Post Service 发送空消息
- android - 无法在 NestedScrollView 内完全滚动
- flask - Flask Swagger 文档查询参数 GET 需要
- excel - 如果一列中具有相同内容的两行在另一列中的值不同,我想更改一行的颜色
- c# - asp.net MVC 读取 URL 查询参数
- sql - SQL 脚本游标和循环