2012-05-18 117 views
9

我正在複製圖像。 (我的實際代碼是調整圖像大小,但這與我的問題無關。)我的代碼看起來像這樣。使用Graphics.DrawImage()繪製透明度/ Alpha通道圖像

Image src = ... 

using (Image dest = new Bitmap(width, height)) 
{ 
    Graphics graph = Graphics.FromImage(dest); 
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    graph.DrawImage(src, 0, 0, width, height); 
    dest.Save(filename, saveFormat); 
} 

這似乎除非src從圖像加載有透明膠片(如GIF)或α信道(諸如PNG)工作極大。

如何獲得DrawImage()將透明膠片/ alpha通道傳輸到新圖像,然後在保存文件時保留它們?

+0

問題是'saveFormat'變量的值是什麼?它應該是'PixelFormat.Format32bppArgb'(或處理了alpha通道的另一種格式)。另請嘗試:'使用(圖像dest =新位圖(寬度,高度,PixelFormat.Format32bppArgb))'。 –

+0

這似乎適用於alpha通道,但不適用於GIF透明膠片。 'saveFormat'會根據輸入文件的格式而有所不同。如果輸入文件不支持Alpha通道,那麼假設圖像不包含Alpha通道像素是安全的。 –

+0

那麼,saveFormat對GIF文件的價值是什麼:)? –

回答

22

這是很不清楚,有很多你沒有說。透明度最大的問題是你看不到它。您跳過了幾個步驟,沒有明確指定新位圖的像素格式,您根本沒有初始化它,並且沒有說明使用的輸出格式。有些不支持透明度。所以讓我們製作一個清晰的版本。從看起來像這樣在paint.net一個PNG圖像:

enter image description here

使用此代碼

 using (var src = new Bitmap("c:/temp/trans.png")) 
     using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
     using (var gr = Graphics.FromImage(bmp)) { 
      gr.Clear(Color.Blue); 
      gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
      bmp.Save("c:/temp/result.png", ImageFormat.Png); 
     } 

產生這一形象:

enter image description here

你可以清楚地看到藍色背景,所以透明度工作。

+1

那麼,我的意圖是支持與輸入文件相匹配的任何格式。我以爲我很特別。這只是代碼並不意味着只支持一種文件類型。也許我需要一堆代碼來處理每種文件類型 - 我不知道。我確實嘗試了像你一樣指定PixelFormat,但是當文件類型是帶有透明度的GIF時,它似乎導致了錯誤。而且,實際上,一些變體似乎可以在沒有指定PixelFormat的情況下使用PNG工作。 –

+0

@JonathanWood使用舊位圖的寬度和高度以及新的所需格式創建一個新的位圖。最好在using語句中創建一個Graphics對象FromImage(你的新位圖)和DrawImage(你的舊位圖)。 – 2016-02-20 16:10:19