2014-11-13 1 views
0

BinaryReader를 사용하여 이미지의 바이트를 읽는 중 BinaryReader를 사용하여 비트 맵 이미지의 ARGB 값을 읽으려고 할 때 문제가 발생합니다. 누구든지 비트 맵 이미지의 각 픽셀에 대한 바이트 값을 얻을 수있는 방법을 제안 할 수 있습니까? 헤더에서 픽셀 형식을 파악하고 그에 따라 데이터를 올바르게 구문 분석을 포함 할 것이다 파일을 제대로 읽기 http://en.wikipedia.org/wiki/BMP_file_format : 사전C# 비트 맵 이미지의 색상 바이트 값을 읽는 데 BinaryReader 사용

현재 사용할 수있는 BMP 파일 형식을 연구해야합니다
+0

쉬운 방법 : 사용하는 getPixel (x, y)의 비트 맵 (저속), 비트 맵 사용하여 포인터 (고급 읽기의 방법하지만, 빨리) –

+0

비트 맵 함수가 아니라 BinaryReader를 사용하는 방법을 알고 있습니까? –

+0

http://www.codeproject.com/Questions/308076/Read-bitmap-file-using-binary-reader-in-csharp 제 2 해결책을 읽어보십시오 –

답변

1

쉬운 방법은 안전하지 않은 컨텍스트를 사용하고 일부 비트를 잠그는 것입니다. 과도하게 단순화 샘플 : 당신은 여전히 ​​BinaryReader를를 사용해야하고 당신이 얼마나 많은 바이트 픽셀 당 알고있는 경우

unsafe 
{ 
    var bitmapData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat); 

    byte* first = (byte*)bitmapData.Scan0; 
    byte a = first[0]; 
    byte r = first[1]; 
    byte g = first[2]; 
    byte b = first[3]; 

    ... 

    bmp.UnlockBits(bitmapData); 
} 

그러나, 단지 헤더를 생략 할 수 있습니다 (당신이 찾을 수는 @Bradley_Ufffner의 링크 길이입니다) 바이트를 액세스하십시오. 당신이 BinaryReader를를 사용하여 비트 맵의 ​​픽셀 데이터를 읽을해야하는 경우

0

에서

감사합니다. 파일은 구개음 처리 될 수 있습니다.이 경우 색상 표 데이터를 읽고이를 사용하여 픽셀을 실제 색상에 매핑해야합니다. 픽셀 데이터는 또한 압축 될 수 있으며 헤더의 값에 따라 추출되어야합니다.

이것은 단순한 프로젝트가 아니며, 그래픽 라이브러리가 발명 된 이유입니다.

0

, UnmanagedMemoryStream 시도 :

Bitmap bmp = new Bitmap("img.bmp"); 
var bits = bmp.LockBits(new Rectangle(0,0,bmp.Width,bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 
try{ 
    unsafe{ 
     using(Stream bmpstream = new UnmanagedMemoryStream((byte*)bits.Scan0, bits.Height*bits.Stride)) 
     { 
      BinaryReader reader = new BinaryReader(bmpstream); 
      for(int y = 0; y < bits.Height; y++) 
      { 
       bmpstream.Seek(bits.Stride*y, SeekOrigin.Begin); 
       for(int x = 0; x < bits.Width; x++) 
       { 
        byte b = reader.ReadByte(); 
        byte g = reader.ReadByte(); 
        byte r = reader.ReadByte(); 
        byte a = reader.ReadByte(); 
       } 
      } 
     } 
    } 
}finally{ 
    bmp.UnlockBits(bits); 
} 
관련 문제