2011-01-27 2 views
1

ImageFormat.Bmp 형식의 Bitmap.Save 메서드를 사용하면 파일의 비트 맵 헤더 정보가 biSizeImage 필드에 0으로 나타납니다.이미지 크기 필드에 파일 비트 맵 저장에 0이 있습니다.

스펙에서 볼 수 있듯이 불행히도 내가 올바르게 작동하도록 설정해야하는 진부한 임베디드 장치가 올바르게 설정되었습니다.

그래서 비트 맵을 저장할 때이 헤더 정보 필드를 항상 설정하는 방법에 대해 궁금한 점이 있습니까?

답변

3

의심되는 것처럼이 문제는 0이 RGB 비트 맵의 ​​이미지 크기 필드에 완벽하게 허용되는 값이라는 것입니다.

biSizeImage
화상의 크기 (바이트), 상기 구조체의 BITMAPINFOHEADERMSDN documentation는이 사실을 확인한다. BI_RGB 비트 맵의 ​​경우이 값을 0으로 설정할 수 있습니다.

biCompressionBI_JPEG 또는 BI_PNG 경우 biSizeImage는 각각 JPEG 또는 PNG 화상 버퍼의 크기를 나타낸다.

.NET Framework에서의 구현은 단순히 표준적이고 문서화 된 방식으로 수행합니다. 다른 것을 필요로하기 때문에 직접 파일 저장 프로세스를 처리해야합니다. 그러면 BITMAPINFOHEADER 구조의 biSizeImage 구성원을 수동으로 수정할 수 있습니다.

매우 포괄적 인 예가 Saving a Control Image to a Bitmap File입니다. 물론 Compact Framework 용으로 작성되었지만 대부분의 개별 구성 요소는 여전히 적용 가능합니다. Windows API에서 여러 함수를 P/Invoke (정의는 www.pinvoke.net을 방문)해야하며 DC로 작업해야합니다.

GDI +가 아닌 GDI 하위 시스템을 사용하기 때문에 자신의 손으로 드로잉을 가져 오는 것이 더 빠를 수도 있습니다. 이 일반적인 접근법에 대한 기사는 1bpp in C#에서 확인할 수 있으며 BITMAPINFOHEADER 구조체를 사용하여 직접 문제를 해결하는 것으로 나타납니다.

관리되지 않는 C++ 코드를 이해하는 경우 여기에서 사용할 수있는 튜토리얼을 사용하면 동일한 작업을 수행하기 위해 C#에서 구현해야하는 내용을 알 수 있습니다. Loading and Saving Bitmaps. 보시다시피, 필요한 코드는 실제로 한 줄의 Bitmap.Save 메서드 이상이지만 길지 않습니다.

+0

고마워, 나는 pinvoke를 피하기 위해 바라고 있었지만 그것은 유일한 길처럼 보였다. – user380689

+0

@ user380689 : 다른 어떤 방법을 모르겠습니다. 문제는, 당신이 지적한대로, 0은'biSaveImage' 멤버의 * expected * 값입니다. 'BITMAPINFOHEADER' 구조체에 대한 [MSDN documentation] (http://msdn.microsoft.com/en-us/library/dd183376.aspx)은 "BI_RGB 비트 맵에서이 값을 0으로 설정할 수 있습니다."라고 확인합니다. 사실, 상수 BI_RGB의 값은 0입니다. .NET Framework는 문서화 된 방식으로 표준 작업을 수행합니다. 당신이 다른 것을 필요로한다면, 당신은 당신 자신의 손에 문제를 가져 가야 할 것입니다. –