2009-02-17 6 views
1

J'ai un problème avec Lockbits. Je recherche des pixels noirs, et parce que cela ne me semble pas correct, j'utilise un WindowPopup pour imprimer les couleurs de chaque pixel, mais c'est comme si mon programme utilisait une autre image.Utiliser Lockbits pour rechercher des pixels noirs, mais est-ce au hasard?

alt text http://i208.photobucket.com/albums/bb91/Savaronna/pixel-1.jpg?t=1234874238

I a marqué le premier pixel noir rouge trouvé. Comme vous pouvez le voir, il y a plusieurs autres pixels qui devraient correspondre. Qu'est-ce que je fais mal?

Ceci est mon script, est-ce que je supervise quelque chose?

Bitmap b = this.TableListBMP; 
BitmapData bmpData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), 
           ImageLockMode.ReadWrite, 
           PixelFormat.Format32bppPArgb); 

int stride = bmpData.Stride; 
IntPtr Scan0 = bmpData.Scan0; 

unsafe 
{ 
    byte * p = (byte *)(void *)Scan0; 
    int nOffset = bmpData.Stride - b.Width*4;  
    int xOffset, yOffset; 

    for(int y=5; y<b.Height; ++y) 
    { 
    for(int x=1; x<b.Width; ++x) 
    { 
     MessageBox.Show(
     string.Format("x={0}, y={1}, ARGB={2},{3},{4},{5}", 
      x, y, 
      Convert.ToString(p[(y*stride)+(x*4)]), 
      Convert.ToString(p[(y*stride)+(x*4)+1]), 
      Convert.ToString(p[(y*stride)+(x*4)+2]), 
      Convert.ToString(p[(y*stride)+(x*4)+3]))); 
     p +=4; 
    } 
    // EDIT: This line should be removed 
    p += nOffset; 
    } 
} 
b.UnlockBits(bmpData); 

Répondre

3

Si vous utilisez des décalages tels que p[((y)*stride)+((x)*4)], vous ne devriez probablement pas augmenterez p du tout? Sûrement vous avez déjà traité cela (x et y) avec la multiplication? En outre, bmpData.Stride - b.Width*4 n'est pas (autant que je peux voir) un nombre significatif ... la foulée est la taille des lignes, y compris le remplissage.

Supprimez le code "p += ..." ou modifiez l'algorithme de décalage. En ce moment, vous ignorez les données (mauvaises) et accédez aux données en dehors de l'objet (très mauvais).

+0

je veux juste vous faire savoir, j'ai supprimé la partie p + = et cela fonctionne. Merci pour votre aide – Sven

Questions connexes