2011-09-16 4 views
0

이미지의 모든 픽셀을 스캔하고 색상이 분홍색 인 픽셀을 찾을 때마다 프로그램을 만듭니다. 픽셀을 검정색으로 만듭니다. 그러나 이미지 위에 두 개가있는 경우 분홍색 픽셀을 찾지 않는 것 같습니다. 내가 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 포인터에 대한 지식이없고 관리되지 않는 데이터에 액세스 할 수 정렬 화 클래스의 사용을 필요로 그것은 C#을보다 VB에서 좀 더 까다로운. 다음은 몇 가지 샘플 코드입니다. (원래는 웬일인지 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