2017-08-11 1 views
0

Mein Ziel ist es, meine 256x256 Pixel große Bitmap zu laden und jedem Pixel entweder einen weißen oder schwarzen Farbwert zuzuweisen, abhängig davon, ob der tatsächliche Wert unter einen bestimmten Schwellenwert fällt.BitmapData manipulieren, nur 1/3 wird geändert

Problem ist, nur 1/3 der Breite der Bitmap hat die neuen Pixeldaten, obwohl die innere for-Anweisung über die gesamte Breite iteriert.

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

Was ist der Wert von 'ThresholdFilter'? – erikscandola

+0

Es ist ein Int32, mit einem Bereich 0-255 – Yama

+0

Es ist möglich, dass in einigen Fällen, in Ihrer 'Zeile [k]' bleibt der Anfangswert? Hast du es mit einem anderen Bild versucht? – erikscandola

Antwort

3

Ihr Problem ist, dass Sie ein 24bpp Bild als 8bpp behandeln. Jedes Pixel wird von 3 Bytes beschrieben, nicht von einem. Der Code könnte auf folgende Weise geändert werden:

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); 
} 

Nur um sicher zu sein, können Sie überprüfen, ob row[k], k + 1 and k + 2 alle unter/über dem ThresholdFilter sind, aber Sie brauchen nur, dass, wenn es, dass das Bild passieren könnte, ist nicht gray .

Darüber hinaus sollten Sie wahrscheinlich am Anfang überprüfen, ob das Bild tatsächlich im 24bppRgb-Format ist, um einen Absturz der Anwendung zu vermeiden, wenn dies nicht der Fall ist.

+0

Funktioniert perfekt, danke Milster – Yama

Verwandte Themen