2013-08-02 8 views
1

비트 맵 파일의 각 픽셀에 대해 픽셀 색 값을 추출하는 코드를 작성하려고합니다. 이러한 목적으로 bmp를 비트 맵 객체로 가져 왔고 Bitmap.GetPixel (x, y) 메서드를 사용했지만 응용 프로그램에 충분히 빠르지 않았습니다. 동료 중 한 명이 조언을주었습니다. 나는 fopen을 사용하여 파일 자체를 열고 바이트 데이터를 배열로 파싱 할 수 있다고 생각한다. 혹시 혹시 생각이 있으십니까? fopen 메소드를 사용하는 것은 필수가 아니며, 나는 무엇이든 사용할 수 있습니다.Fopen을 사용하는 비트 맵 []으로 비트 맵

미리 감사드립니다.

+0

그것은 그렇게 쉬운 일이 아니다 : 나는이 방법으로 해결할 것입니다. 원시 데이터에서 다른 형식을 대상 형식으로 변환해야하며 이는 쉬운 일이 아닙니다. 적어도 이것이 내가 얼마나 알고 있는지. 'byte [] data = System.IO.File.ReadAllBytes ('file.bmp')'를 사용하여 데이터를 얻을 수 있지만, 포맷에 관해서 이야기했습니다. – MahanGM

+0

fopen() 함수는 FileStream 또는 File.ReadAllBytes() 또는 Image.FromFile()보다 빠르거나 다르지 않습니다. 안전하지 않은 포인터를 사용하는 데 중점을 둡니다. GetPixel()의 대안입니다. Bitmap.LockBits()를 사용하면 많은 Google 검색 결과가 있습니다. –

답변

2

안전하지 않은 코드 블록을 사용하거나 Marshal class을 사용할 수 있습니다.

public static byte[] GetBytesWithMarshaling(Bitmap bitmap) 
{ 
    int height = bitmap.Height; 
    int width = bitmap.Width; 

    //PixelFormat.Format24bppRgb => B|G|R => 3 x 1 byte 
    //Lock the image 
    BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 
    // 3 bytes per pixel 
    int numberOfBytes = width * height * 3; 
    byte[] imageBytes = new byte[numberOfBytes]; 

    //Get the pointer to the first scan line 
    IntPtr sourcePtr = bmpData.Scan0; 
    Marshal.Copy(sourcePtr, imageBytes, 0, numberOfBytes); 

    //Unlock the image 
    bitmap.UnlockBits(bmpData); 

    return imageBytes; 
} 
+0

이것은 첫 번째 대답이었으며 완벽하게 작동했습니다. 고맙습니다. 하지만 클래스에 대한 클래스가 무엇인지 이해할 수 없었고, lockbits 메소드가하는 일을 간략하게 설명해 주시겠습니까? – talkanat

+1

1, Lockbits => 개체 수명 동안 메모리의 위치가 변경 될 수 있습니다 (예 : 가비지 수집 후). 이 동작을 방지하기 위해 비트 맵은 메모리에서 잠기거나 고정됩니다. 나는 그것이 고정 진술처럼 작동한다고 생각한다. 2, Marshal은 관리 코드와 관리되지 않는 코드를 상호 운용하고 관리되지 않는 메모리를 할당하는 등 일련의 메서드가있는 정적 클래스입니다. – boli