簡體   English   中英

如何在 C# 中將 32bpp 圖像轉換為 16 bpp 圖像? (灰度)

[英]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 格式),而是保存到PixelFormatFormat16bppGrayScaleBitmap

...但我應該警告你這是徒勞的,因為一路上的某個地方(我忘記了,確切地說)你會發現基本上沒有辦法將Bitmap保存為真正的灰度格式。 它總是會出現 RGB 或索引。 據我了解,這是 GDI+ 的限制。 有關更多信息,您可以交叉手指,Hans Passant 可能會對您的問題發表評論。 我會嘗試找到他解釋問題的問題的鏈接。

哦,我還要補充一點,平均 R、G 和 B 通道並不是將顏色轉換為灰度的“正確”方法。 有關更多詳細信息,請參閱此問題

我想我應該進一步注意,如果你沒有在其他地方讀過它, GetPixelSetPixel很慢,並且對於設置大量數據,建議使用LockBitsUnlockBits

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM