2017-08-11 48 views
0

我的目標是加載我的256x256像素大小的位圖,並根據實際值是否低於某個閾值爲每個像素指定白色或黑色顏色值。操作BitmapData,只有1/3被修改

問題是,只有1/3位寬的位圖具有新的像素數據,即使內部for-statement遍歷整個寬度。

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

在某些情況下,在你的'行[k]'中保留初始值是可能的嗎?你用另一張圖片試過了嗎? – erikscandola

回答

3

您的問題是你如何對待和24bpp圖像8bpp的。每個像素由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 * 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); 
} 

只是要確保你可以檢查是否row[k], k + 1 and k + 2都低於/的ThresholdFilter上面,但你只需要,如果是可能發生的圖像沒有灰度化。

此外,如果圖像實際上是24bppRgb格式,您應該在開頭檢查,以避免應用程序崩潰,如果它實際上不是。

+0

完美地工作,謝謝米爾斯特 – Yama