2017-01-09 54 views
-3

我試圖轉換爲灰度,但它不是16 bpp 如何使用下面的代碼獲取16 bpp灰度圖像。如何在C#中將32bpp圖像轉換爲16 bpp圖像? (灰度)

for (int y = 0; y < tr.Height; y++) 
     { 
      for (int x = 0; x < tr.Width; x++) 
      { 
       //get pixel value 
       p = tr.GetPixel(x, y); 

       //extract pixel component ARGB 
       int a = p.A; 
       int r = p.R; 
       int g = p.G; 
       int b = p.B; 

       //find average 
       int avg = (r + g + b)/3; 

       //set new pixel value 
       tr.SetPixel(x, y, Color.FromArgb(a, avg, avg, avg)); 
      } 
     } 
+0

'tr'究竟是什麼? – devRicher

+4

非常令人困惑 - 看起來像代碼期望的圖像是彩色32bpp和灰度16bpp格式在同一時間...確保你提供了真正的[MCVE],而不是一些未經試驗的代碼。 –

回答

0

在這裏,你只是改變顏色,而不是改變像素格式。您計算的平均值將介於0到255之間,然後您將still-RGBA圖像中的每個通道設置爲該數字。要在計算出的平均值中獲得更多分辨率,可以在求和之前將每個通道乘以256。然後,您計算的平均值將介於0和65535之間。但是,您希望將這些值保存到原始的Bitmap(仍爲RGBA格式),而不是BitmapPixelFormatFormat16bppGrayScale

...但是我應該警告你這是徒勞的,因爲在某個地方(我完全忘了它在哪裏),你會發現基本上沒有辦法將Bitmap保存爲真正的灰度格式。它會一直出現RGB或索引。據我瞭解,這是GDI +的限制。欲瞭解更多信息,你可以跨越你的手指,也許Hans Passant會對你的問題發表評論。我會嘗試找到他解釋問題的問題的鏈接。

哦,我應該進一步補充說,平均R,G和B通道並不是將顏色轉換爲灰度的「正確」方式。有關更多詳細信息,請參閱this question

而且我想我應該還注意到,如果你沒有看過其他地方,那GetPixelSetPixel是緩慢的,並設置了大量的數據則建議使用LockBitsUnlockBits