2017-05-22 2 views
0

Je souhaite modifier les pixels d'une image entre 140 et 180. J'ai donc utilisé le code suivant. Mais il ne sauvegarde que l'image originale, pas celle qui a été changée. Aidez-moi à convertir les pixels de l'image entre 140 et 180 en 0 (couleur noire). Ci-dessous mon code:Modification d'une plage particulière de valeurs de pixel à la valeur requise dans C#

public void convertImage(string imag)//some file path 
{ 
    using (Bitmap image = new System.Drawing.Bitmap(imag)) 
    { 
     BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 

     IntPtr ptr = data.Scan0; 
     int size = data.Stride * image.Height; 
     byte[] bytes = new byte[size]; 
     Marshal.Copy(ptr, bytes, 0, bytes.Length); 

     for (int y = 0; y < image.Height; y++) 
     { 
      for (int x = 0; x < image.Width; x++) 
      { 
       if (
        (140 < bytes[(y * data.Stride) + (x * 3) + 2]) && (180 > bytes[(y * data.Stride) + (x * 3) + 2]) && 
        (140 < bytes[(y * data.Stride) + (x * 3) + 1]) && (180 > bytes[(y * data.Stride) + (x * 3) + 1]) && 
        (140 < bytes[(y * data.Stride) + x * 3]) && (180 > bytes[(y * data.Stride) + x * 3]) 
        ) 
       { 
        bytes[(y * data.Stride) + (x * 3) + 2] = (int)0; 
        bytes[(y * data.Stride) + (x * 3) + 1] = (int)0; 
        bytes[(y * data.Stride) + x * 3] = (int)0; 
       } 
      } 
     } 

     Marshal.Copy(bytes, 0, ptr, bytes.Length); 
     image.UnlockBits(data); 
     image.Save("sys.bmp", ImageFormat.Bmp); 
     image.Dispose(); 
    } 
} 

Ici je suppose mon image est d'avoir des pixels de gris entre 140 à 180 de chaque couleur. Aidez-moi, s'il vous plaît.

+0

Avez-vous traversé cela dans le débogueur? Savez-vous que vous entrez dans le bloc 'if'? – adv12

+0

Lorsque vous avez terminé, quelle image recherchez-vous pour les changements? L'image originale ou 'sys.bmp'? – adv12

+0

Invoque UnlockBits juste après votre premier Marshal.Copy. Et en plus, pas besoin de disposer votre image, l'utilisation de la déclaration est là pour cela. –

Répondre

2

Remplacer ImageLockMode avec ReadWrite plutôt que ReadOnly.

BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
+1

Ha! Si évident une fois qu'il est souligné! +1 – adv12

+0

Oh super, son fonctionnement merci beaucoup. –

+0

@subrahmanyeswaraswamymurala Merci! S'il vous plaît marke répondre comme correct alors. –