2011-10-22 2 views
0

C++의 원시 데이터를 기반으로 bmp를 작성하는 것을 이해하려고하는데 몇 가지 질문이 있습니다.C++ Bitmap 픽셀 당 비트

내 bmp는 흑백 일 수 있으므로 픽셀 필드 당 비트가 1로 있어야한다고 생각했습니다. 그러나 많은 가이드에서 패딩 필드가 32 비트 정렬을 유지하는 비트 수를 추가한다는 것을 알았습니다. 즉, 내 bmp는 픽셀 당 24 비트 bmp와 동일한 파일 크기가됩니다.

이 이해가 정확하거나 어떤 방식으로 24 비트, 32 비트보다 작은 픽셀 당 1 비트가 있습니까?

감사

+2

패딩은 픽셀 단위가 아닌 스캔 라인 당입니다. –

답변

1

흑백 비트 맵도 정렬되어 있지만 32분의 24-BPP들만큼 많은 공간을 차지하지 않습니다.

  • 5 픽셀 너비의 24 비트 비트 맵 행은 픽셀의 경우 5 * 3 = 15이고 패딩의 경우 1 바이트입니다.
  • 5 픽셀 너비의 32 비트 비트 맵 행은 20 바이트를 사용합니다. 픽셀의 경우 5 * 4 = 20이며, 패딩이 필요하지 않습니다.
  • 5 픽셀 너비의 흑백 비트 맵 행은 4 바이트를 차지합니다. 픽셀의 경우 1 바이트입니다 (1 바이트 미만을 사용할 수 없기 때문에 전체 바이트가 사용되지만 8 비트 중 3 비트는 사용되지 않습니다). 패딩의 3 바이트.

따라서 모노크롬 비트 맵은 물론 24 비트보다 작습니다.

1

비트 맵 행은 32 비트 경계로 정렬/패딩되어 있지만 위의 정보는 이미 제공되어 있지만 자세한 정보가 필요하면 "DIB 헤더"섹션 인 DIBs and Their Uses을 읽어보십시오. .

모든 스캔 라인은 DWORD로 정렬됩니다. 스캔 라인은 버퍼링되어 정렬됩니다. 버퍼링은 반드시 0 일 필요는 없습니다.

스캔 라인은 거꾸로 저장되며 메모리의 첫 번째 스캔 (스캔 0)은 이미지의 맨 아래 스캔입니다. (그림 1 참조) 이것은 Presentation Manager 호환성의 또 다른 아티팩트입니다. GDI는 Set 및 Get 작업 중에 이미지를 자동으로 반전합니다. 그림 1. (메모리 및 화면 표현을 보여주는 임베디드 이미지)

관련 문제