2009-07-25 47 views
2

我有一些小的透明GIF圖像(在100×100),並寫了下面的代碼在所有的像素迭代給我的RGB值:C#圖形新手問題

private void IteratePixels(string filepath) 
{ 
    string dataFormat = String.Empty; 
    Bitmap objBitmap = new Bitmap(filepath); 
    int counter = 0; 
    for (int y = 0; y < objBitmap.Height; y++) 
    { 
     for (int x = 0; x < objBitmap.Width; x++) 
     { 
      Color col = objBitmap.GetPixel(x, y); 
      dataFormat = String.Format("{0} => Red: {1:x} Green: {2:x} Blue: {3:x}", 
       counter++, col.R, col.G, col.B); 
      System.Diagnostics.Debug.WriteLine(dataFormat); 

      // Perform an operation on the Color value here. 
      // objBitmap.SetPixel(x, y, col); 
     } 
    } 


} 

代碼工作(儘管是緩慢的,因爲的GetPixel和字符串格式),但我最驚訝的是,輸出報告透明像素是黑色的!我想知道爲什麼?

0 =>紅色:綠色0:0藍:0
1 =>紅色:綠色0:0藍:0 ...

現在讓我們假設,如果我也有一個透明的gif圖像一個覆蓋圖像面積25%的黑色背景,我怎麼知道像素是透明還是黑色?

回答

2

對不起,我不能提供詳細的答案,但GIF將顏色存儲在調色板(基本上是陣列)中,最多256個條目,而不是RGB值。所以透明度與數組中的元素相關聯,而不是特定的顏色。您可以將rgb(0,0,0)分配給調色板中的不同位置,從而允許透明度和純黑色。

5

圖片真的有4個屬性:紅色,綠色,藍色和阿爾法。

Alpha是一個區域是多麼透明。 GIF圖像只支持透明/不透明,不像其他格式,如PNG,具有完整的alpha支持,所以你可以做像40%透明像素的東西。

您可以在上面的代碼中用col.A訪問它。

作爲參考,MSDN Color結構是http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx

0

在牢記其他有用的答案,一旦你開始在每個像素的Alpha值的角度思考,你怎麼能告訴完全透明的黑色之間的區別,完全透明的藍色,橙色或黃色?當您在任何現有像素上繪製它們時,它們並沒有真正的不同:當您在其上繪製(完全)透明的外套時,下面的顏色不會改變。如果gif中的那些透明像素在循環代碼中變回黑色,那麼這只是因爲它是一個常見的合理的默認設置,將所有內存值設置爲零(R = 0,G = 0,B = 0,A = 0)---這是「透明的黑色」(在某種程度上)。