[英]How can i convert a 22bpp gif image to a 32bpp gif image in C#?
[英]how to convert 32bpp image to 16 bpp image in C#? (Grayscale)
我試圖轉換為灰度,但它不是 16 bpp 如何使用以下代碼獲得 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 到 255 之間,然后將靜止 RGBA 圖像中的每個通道設置為該數字。 為了在計算出的平均值中獲得更高的分辨率,您可以在求和之前將每個通道乘以 256。 那么您計算的平均值將介於 0 和 65535 之間。但是您希望將這些值保存到原始Bitmap
(仍為 RGBA 格式),而是保存到PixelFormat
為Format16bppGrayScale
的Bitmap
。
...但我應該警告你這是徒勞的,因為一路上的某個地方(我忘記了,確切地說)你會發現基本上沒有辦法將Bitmap
保存為真正的灰度格式。 它總是會出現 RGB 或索引。 據我了解,這是 GDI+ 的限制。 有關更多信息,您可以交叉手指,Hans Passant 可能會對您的問題發表評論。 我會嘗試找到他解釋問題的問題的鏈接。
哦,我還要補充一點,平均 R、G 和 B 通道並不是將顏色轉換為灰度的“正確”方法。 有關更多詳細信息,請參閱此問題。
我想我應該進一步注意,如果你沒有在其他地方讀過它, GetPixel
和SetPixel
很慢,並且對於設置大量數據,建議使用LockBits
和UnlockBits
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.