[英]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.