2017-01-09 6 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の間になり、静止画RGBAの各チャンネルをその数値に設定します。計算された平均でさらに解像度を上げるには、合計する前に各チャネルに256を掛けます。計算した平均値は0と65535の間になりますが、元のBitmap(まだRGBA形式)ではなく、PixelFormatFormat16bppGrayScaleBitmapに保存することをお勧めします。

...しかし、私はどこかに沿ってどこか(正確に)あなたが本当にグレースケールのフォーマットにBitmapを保存する方法がないことを発見するので、これは無益だと警告する必要があります。常にRGBまたはインデックスに登録されます。私が理解する限り、これはGDI +の限界です。詳細については、ハンス・パサントがあなたの質問にコメントしてくれるかもしれないという指を挟むことができます。私は彼が問題を説明する質問へのリンクを見つけることを試みる。

私はさらに、R、G、Bチャンネルの平均化は、カラーをグレースケールに変換する「正しい」方法ではないことを付け加えておきます。詳細はthis questionを参照してください。

そして私は、私はさらにあなたがGetPixelSetPixelが遅いこと、他の場所でそれを読んでいない、と多くのデータを設定するために、LockBitsUnlockBitsを使用することをお勧めします場合には、注意する必要がありますね。

関連する問題