2014-12-01 151 views
4

我正在大學學習機器學習問題,我的第一份工作是將圖像轉換成黑白圖像。移除圖像透明度

問題是我的圖像有透明度,我不知道如何去除它。

我試圖:

public static Bitmap RemoveTransparency (Bitmap src) 
{    
    Bitmap target = new Bitmap (src.Size.Width, src.Size.Height); 
    Graphics g  = Graphics.FromImage (target); 

    g.Clear (Color.White);    
    g.DrawImage (src, 0, 0); 

    return target; 
} 

輸入圖像的一個例子:

My captcha image

後 「RemoveTransparency」 呼叫輸出圖像的一個例子:

Output image

確實任何人都知道發生了什麼事?看起來像背景的字母有相同的顏色...我的背景是黑色的,如果我着色爲白色?

謝謝!

+0

什麼是你的'src'圖像的來源?它以什麼方式「具有透明度」?如果它實際上是一個32bpp位圖,透明像素的alpha值爲0,那麼你發佈的代碼就可以工作。所以這並不意味着你會留下一些關於原始圖像的關鍵信息。您應該發佈一個完整的代碼示例,包括源位圖的自包含初始化。請參閱http://stackoverflow.com/help/mcve – 2014-12-01 17:59:14

+0

備案:我下載了包含在問題中的確切圖像,運行問題中的代碼,並將結果保存到新的.png文件中。正如預期的那樣,它工作正常。你得到的答案可能是一個解決方法,以抵消你的代碼中的一些其他錯誤,但它不是真正的解決這個問題的正確方法,如果你期望原始位圖像過去一樣具有透明度,有你的問題。 – 2014-12-01 18:21:45

+0

@PeterDuniho你在這裏傳播錯誤信息。我也下載了圖像。它有透明的黑色像素。 'Graphics'對象的默認'CompositingMode'是'SourceCopy'。 「...並將結果保存到一個新的.png文件中。」您的PNG文件具有透明度,所以您的輸出也具有透明的黑色像素。嘗試保存爲不帶alpha通道的JPG。您會發現圖像全黑,因爲在白色背景上繪製透明黑色像素時未使用Alpha混合。 – 2014-12-01 18:43:11

回答

5

你需要在它上面繪製其他圖像之前你Graphics對象的CompositingMode設置爲SourceOver

g.Clear(Color.White); 
g.CompositingMode = CompositingMode.SourceOver; 
g.DrawImage(src, 0, 0); 

默認CompositingModeSourceCopy,它走的是透明的黑色(R = G = B = A = 0)在src圖像像素和使它們爲黑色像素。 SourceOver將做alpha混合,這就是你要找的。

查看詳情:CompositingMode Enumeration

+0

感謝您的幫助@蒂莫西,我可以繼續使用位圖嗎?或者我必須使用圖像?它繼續使用位圖返回黑色=/ – Crasher 2014-12-01 17:56:05

+0

@Crasher這裏使用「Bitmap」類很好。我絕對肯定這個問題,修復是我在上面描述的。在這裏描述的問題旁邊肯定還有其他問題。 – 2014-12-01 17:59:13

+0

@TimothyShields:如果原始位圖使用0,0,0的RGB表示透明像素,那麼爲什麼原始位圖中的黑色數字可見?請注意,他在他的文章中發佈的位圖具有真實的透明度,並且可以在發佈的代碼中正常工作。 – 2014-12-01 18:01:54