2011-02-27 6 views
1

Bitmap을 읽어서 Color 값의 행렬을 만드는 클래스가 있습니다. 클래스는 이미지 포인터를 사용하여 unsafe 블록 내부의 픽셀에서 각 바이트를 직접 읽습니다. 이 클래스의 목적은 이미지를 새로운 파일로 저장하기 전에 픽셀 값을 메모리로 읽어서 필터를 실행할 수있게하는 것입니다.픽셀 단위의 액세스가 안전하지 않은 비트 맵을 그리면 빈 이미지가됩니다.

GDI +의 setPixel() 메서드를 사용하여 이미지를 다시 만들 수 있지만 내 필요에 비해 속도가 너무 느립니다.

나는 다음과 같은 기능을 사용하여 새 이미지 파일을 저장하려고 오전 :

public void saveImageFromPixels() 
    { 

     this.newBitmap = new Bitmap(srcBitmap.Width, srcBitmap.Height); 

     BitmapData imgData = newBitmap.LockBits(new Rectangle(0, 0, newBitmap.Width, newBitmap.Height), 
               ImageLockMode.ReadWrite, 
               PixelFormat.Format24bppRgb); 

     int stride = imgData.Stride; 
     System.IntPtr Scan0 = imgData.Scan0; 

     unsafe 
     { 
      byte* p = (byte*)(void*)Scan0; 
      int nOffset = stride - newBitmap.Width * 3; 

      for (int x = 0; x < newBitmap.Height; ++x) 
      { 

       for (int y = 0; y < newBitmap.Width; ++y) 
       { 
        p[0] = (byte)(255 - matrix[y][x].B); 
        p[1] = (byte)(255 - matrix[y][x].G); 
        p[2] = (byte)(255 - matrix[y][x].R); 
        p += 3; 
       } 
       p += nOffset; 
      } 


     } 

     this.newBitmap.Save(@"C:\images\1-d.jpg"); 
    } 

결과 (적절한 치수) 하늘의 이미지는하지만. 픽셀에 직접 액세스하고 Color으로 값을 저장하는 코드는 문제가있는 이미지를 저장하는 것만으로 효과적입니다.

다음 코드는 UnlockBits() 필요 srcBitmapnewBitmap

private Bitmap srcBitmap; 
    private Bitmap newBitmap; 
    private List<List<Color>> matrix; 

    public PixelMatrix(string path) 
    { 

     this.srcBitmap = new Bitmap(path); 

     this.matrix = new List<List<Color>>(srcBitmap.Width); 

     for (int x = 0; x < srcBitmap.Width; x++) 
     { 
      this.matrix.Add(new List<Color>(srcBitmap.Height)); 
     } 

    } 
+2

예, 잠금 해제. 또한 JPEG가 아닌 PNG를 저장한다는 점에 유의하십시오. 그리고 Bitmap (int, int, PixelFormat) 생성자를 사용합니다. x를 사용하여 Height가 아닌 Width를 반복합니다. –

+0

생성자에 대한 팁 주셔서 감사합니다, iterator 고정 될 것입니다 ... 이것은 단지 빠른 해킹했다. – dmck

답변

4

정의합니다.

+0

고마워요. 바로 해결했습니다. – dmck

관련 문제