2017-08-11 4 views
0

Mon objectif est de charger mon bitmap de 256 x 256 pixels et d'affecter à chaque pixel une valeur de couleur blanche ou noire, selon que la valeur réelle tombe en dessous d'un certain seuil.Manipuler BitmapData, seul 1/3 est altéré

Problème: 1/3 de la largeur de la bitmap a les nouvelles données de pixel, même si l'instruction for interne itère sur toute la largeur.

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

Quelle est la valeur de 'TresholdFilter'? – erikscandola

+0

C'est un Int32, avec une plage 0-255 – Yama

+0

Il est possible que, dans certains cas, dans votre rangée [k] 'reste la valeur initiale? Avez-vous essayé avec une autre image? – erikscandola

Répondre

3

Votre problème est que vous traitez une image 24bpp comme 8bpp. Chaque pixel est décrit par 3 octets, pas un. Le code pourrait être modifié de la façon suivante:

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

Juste pour être sûr que vous pouvez vérifier si row[k], k + 1 and k + 2 sont tous en dessous/au-dessus du ThresholdFilter, mais vous avez seulement besoin que s'il peut arriver que l'image ne soit pas en niveaux de gris .

En outre, vous devriez probablement vérifier au début si l'image est en fait au format 24bppRgb pour éviter de bloquer l'application si ce n'est pas le cas.

+0

Fonctionne parfaitement, merci Milster – Yama