2010-11-17 24 views
0

Salut im vraiment nouveau dans le traitement d'image en C# et le code ci-dessous fondamentalement getpixel de l'image que j'ai parcouru de mon ordinateur et comparer la valeur RVB du pixel avec le bon pixel et si c'est la même valeur, il va définirpixel à la couleur cyan. le problème est avec le getpixel, il est vraiment très lent même sur une petite résolution de photos et je cherche aussi à y ajouter plus de fonction. J'ai lu au sujet des lockbits et essayais dehors mais était incapable d'écrire avec succès le code.Impossible d'utiliser avec succès lockbits

namespace Disimage 
{ 
    public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public Bitmap pic; 
    public Bitmap pic2; 

    private bool compare_colour_constant(int original, int sample) 
    { 
     if (original == sample) 
      return true; 
     else 
      return false;    
    } 

    public void btn_browse_Click_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      OpenFileDialog open = new OpenFileDialog(); 
      open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp"; 
      if (open.ShowDialog() == DialogResult.OK) 
      { 
       pic = new Bitmap(Width, Height, PixelFormat.Format24bppRgb); 
       pic2 = new Bitmap(Width, Height, PixelFormat.Format24bppRgb); 

       //pictureBox1.Image = new Bitmap(open.FileName); 
       pic = new Bitmap(open.FileName); 
       pic2 = new Bitmap(open.FileName); 
       pictureBox1.Image = pic; 
       pictureBox2.Image = pic2; 
       pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; 
       textBox1.Text = open.FileName; 
       pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;       
      } 
     } 
     catch (Exception) 
     { 
      throw new ApplicationException("Failed loading image"); 
     } 
    } 


    public void scan_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      //Bitmap pic = new Bitmap(Width, Height, PixelFormat.Format24bppRgb); 
      //Bitmap pic2 = new Bitmap(Width, Height, PixelFormat.Format24bppRgb); 

      pictureBox1.Image = pic; 
      pictureBox2.Image = pic2; 
      progressBar1.Minimum = 0; 
      progressBar1.Maximum = pic.Width; 
      int []RGB = pic.GetPixel(); 

       for (int w = 1; w < pic.Width - 1; w++) 
       { 
        progressBar1.Step = 1; 
        progressBar1.PerformStep(); 

        if (progressBar1.Value == progressBar1.Maximum)     
         progressBar1.Value = 0; 

        for (int h = 1; h < pic.Height - 1; h++) 
        { 
         int red = pic.GetPixel(w, h).R; 
         int green = pic.GetPixel(w, h).G; 
         int blue = pic.GetPixel(w, h).B; 
         int colour = pic.GetPixel(w, h).R + pic.GetPixel(w, h).G + pic.GetPixel(w, h).B; 
         int colour2 = pic.GetPixel(w + 1, h).R + pic.GetPixel(w + 1, h).G + pic.GetPixel(w + 1, h).B; 

         /*textBox2.Text = red.ToString(); 
         textBox3.Text = green.ToString(); 
         textBox4.Text = blue.ToString(); 
         */ 

         int Lred = pic.GetPixel(w - 1, h).R; 
         int Lgreen = pic.GetPixel(w - 1, h).G; 
         int Lblue = pic.GetPixel(w - 1, h).B; 

         int Rred = pic.GetPixel(w + 1, h).R; 
         int Rgreen = pic.GetPixel(w + 1, h).G; 
         int Rblue = pic.GetPixel(w + 1, h).B; 

         if (compare_colour_constant(colour, colour2) == true) 
          pic2.SetPixel(w, h, Color.Cyan); 
        } 
       } 
     }    
     catch (Exception) 
     { 
      throw new ApplicationException("Failed loading image"); 
     } 
    } 
} 

}

+2

Veuillez supprimer les données inutiles de votre exemple de code. Cela ne sert à rien. – leppie

Répondre

1

Bien qu'un peu en retard, je serais heureux de répondre à votre question pour les autres utilisateurs. La première chose que vous devez faire est de déclarer une variable BitmapData, qui contiendrait (évidemment) les données de l'image Bitmap qui a été placée dans la mémoire. Pour ce faire:

System.Drawing.Imaging.BitmapData bmpdata = pic.LockBits(new Rectangle(pictureBox1.Location.X, pictureBox1.Location.Y, pictureBox1.Width, pictureBox1.Height), 
System.Drawing.Imaging.ImageLockMode.ReadWrite, 
System.Drawing.Imaging.PixelFormat); 

Après avoir appelé ce code, vous pouvez procéder à l'édition de BitmapData selon vos préférences. Dans cette situation, vous pouvez appeler une boucle à travers un tableau d'octets des données et comparer le RVB au RVB du pixel immédiatement à droite et déterminer la similarité. Exemple:

unsafe 
{ 
    for (int y = 0; y < bmpdata.Height; y++) // Repeats for each row 
    { 
     byte* row = (byte*)bmpdata.Scan0 + (y * bmpdata.Stride); // Array of bytes for the current row of pixels 
     for (int x = 0; x < bmpdata.Width; x++) // Repeats for each pixel on each row 
     { 
      if (row[x * 4] == row[(x + 1) * 4] && row[(x * 4) + 1] == row[((x + 1) * 4) + 1] && row[(x * 4) + 2] == row[((x + 1) * 4) + 2]) 
      { 
       row[x * 4] = 255; // Blue value of current pixel 
       row[(x * 4) + 1] = 255; // Green Value of current pixel 
       row[(x * 4) + 2] = 0; // Red value of current pixel 
      } 
     } 
    } 
} 

ATTENTION: Bien que le travail pourrait ci-dessus (et laissez-moi insister sur pourrait), il serait probablement beaucoup plus fiable pour aller à Bob Powell's site et lire sa page sur LockBits. Bien qu'il puisse être difficile à comprendre au début, il devient plus simple au fur et à mesure. Sa page est beaucoup plus détaillée que je pourrais être dans cette réponse, et il a probablement des exemples de travail.