簡體   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