2017-08-11 9 views
0

私の目標は、256x256ピクセルサイズのビットマップを読み込み、実際の値が特定のしきい値を下回るかどうかによって、各ピクセルに白または黒の色値を割り当てます。BitmapDataを操作すると、1/3のみが変更されます

問題は、内側のfor文が全体の幅にわたって反復するにもかかわらず、ビットマップが新しいピクセルデータを持つ幅のわずか1/3です。

unsafe 
{ 
    BitmapData bitmapData = bitmap.LockBits(new Rectangle(0,0, 256, 256), ImageLockMode.ReadWrite, bitmap.PixelFormat); 

    for (int j = 0; j < bitmapData.Height; j++) 
    { 
     byte* row = (byte*)bitmapData.Scan0 + (j * bitmapData.Stride); 
     for (int k = 0; k < bitmapData.Width; k++) 
     { 
      if (row[k] <= TresholdFilter) 
       row[k] = 0; 
      if (row[k] > 0) 
       row[k] = 255; 
     } 
    } 
    bitmap.UnlockBits(bitmapData); 
} 

Example Picture

+0

'TresholdFilter'の値は何ですか? – erikscandola

+0

Int32で、範囲は0-255 – Yama

+0

です。場合によっては、 'row [k]'の初期値のままである可​​能性がありますか?別の画像で試しましたか? – erikscandola

答えて

3

あなたの問題は、8bppのよう24bppのイメージを扱うということです。各ピクセルは1バイトではなく3バイトで記述されます。ただ、row[k], k + 1 and k + 2ThresholdFilter上/すべて以下であれば、あなたがチェックできることを確認する

unsafe 
{ 
    BitmapData bitmapData = bitmap.LockBits(new Rectangle(0,0, 256, 256),ImageLockMode.ReadWrite, bitmap.PixelFormat); 

    for (int j = 0; j < bitmapData.Height; j++) 
    { 
     byte* row = (byte*)bitmapData.Scan0 + (j * bitmapData.Stride); 
     for (int k = 0; k < bitmapData.Width * 3; k += 3) 
     { 
      if (row[k] <= TresholdFilter) 
      { 
       row[k] = 0; 
       row[k + 1] = 0; 
       row[k + 2] = 0; 
      } 
      if (row[k] > 0) 
      { 
       row[k] = 255; 
       row[k + 1] = 255; 
       row[k + 2] = 255; 
      } 
     } 
    } 
    bitmap.UnlockBits(bitmapData); 
} 

が、あなたはそれが起こることができれば、画像がグレイスケールされていないことをことを必要とする:コードは次のように変更することができ。

実際にはアプリケーションがクラッシュしないように、イメージが実際に24bppRgb形式であるかどうかを最初に確認することをお勧めします。

+0

完璧に動作します、Milster – Yama

関連する問題