2011-09-16 4 views
0

イメージのすべてのピクセルをスキャンするプログラムを作成しています。ピンクの色を含むピクセルが見つかるたびに、ピクセルを黒くします。しかし、画像上に2つのピンクのピクセルがある場合は、ピンクのピクセルが見つからないようです。私はLockBitsを正しく使用しているかどうかわかりませんが、多分私はそれを間違って使っています。誰かが私が大いにそれを感謝するこれを解決するのを助けることができますか?ここでビットをロックするとピクセルが検出されない

は、以下のコードです:

  Bitmap bitmap = pictureBox1.Image as Bitmap; 
      System.Drawing.Imaging.BitmapData d = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat); 
      IntPtr ptr = d.Scan0; 
      byte[] rgbs = new byte[Math.Abs(d.Stride) * bitmap.Height]; 
      Marshal.Copy(ptr, rgbs, 0, rgbs.Length); 
      Graphics g = pictureBox1.CreateGraphics(); 
      for (int index = 2; index < rgbs.Length; index += 3) 
      { 


       if (rgbs[index] == 255 && rgbs[index - 1] == 0 && rgbs[index - 2] == 255) // If color = RGB(255, 0, 255) Then ... 
       { 
        // This never gets executed! 
        rgbs[index] = 0; 
        rgbs[index - 1] = 0; 
        rgbs[index - 2] = 0; 

       } 
      } 
      Marshal.Copy(rgbs, 0, ptr, rgbs.Length); // Copy rgb values back to the memory location of the bitmap. 
      pictureBox1.Image = bitmap; 
      bitmap.UnlockBits(d); 

答えて

1

あなたは配列にピクセルデータをコピーする必要はありません。 LockBitsのポイントは、直接(安全でない)メモリにアクセスすることです。ピクセルを繰り返して、見つけたときに変更することができます。これを成功させるには、イメージの形式を知る必要があります。

BitmapData bmd=bm.LockBits(new Rectangle(0, 0, 10, 10), 
         ImageLockMode.ReadOnly, bm.PixelFormat); 
    // Blue, Green, Red, Alpha (Format32BppArgb) 
    int pixelSize=4; 

    for(int y=0; y<bmd.Height; y++) 
    { 
    byte* row=(byte *)bmd.Scan0+(y*bmd.Stride); 
    for(int x=0; x<bmd.Width; x++) 
    { 
     int offSet = x*pixelSize; 
     // read pixels 
     byte blue = row[offSet]; 
     byte green = row[offSet+1]; 
     byte red = row[offSet+2]; 
     byte alpha = row[offSet+3]; 

     // set blue pixel 
     row[x*pixelSize]=255; 
    } 
    } 

VBは、ポインタの知識がないとアンマネージデータにアクセスするためにMarshalクラスを使用する必要がありますように、それはもう少しトリッキーVBのC#よりもです。ここにいくつかのサンプルコードがあります。 (これはVBの質問だったが、何らかの理由で私はもともと)。

Dim x As Integer 
    Dim y As Integer 
    ' Blue, Green, Red, Alpha (Format32BppArgb) 
    Dim PixelSize As Integer = 4 
    Dim bmd As BitmapData = bm.LockBits(new Rectangle(0, 0, 10, 10), 
             ImageLockMode.ReadOnly, bm.PixelFormat) 

    For y = 0 To bmd.Height - 1 
    For x = 0 To bmd.Width - 1 
     Dim offSet As Int32 = (bmd.Stride * y) + (4 * x) 
     ' read pixel data 
     Dim blue As Byte = Marshal.ReadByte(bmd.Scan0, offSet) 
     Dim green As Byte = Marshal.ReadByte(bmd.Scan0, offSet + 1) 
     Dim red As Byte = Marshal.ReadByte(bmd.Scan0, offSet + 2) 
     Dim alpha As Byte = Marshal.ReadByte(bmd.Scan0, offSet + 3) 
     ' set blue pixel 
     Marshal.WriteByte(bmd.Scan0, offSet , 255) 
    Next 
    Next 
関連する問題