다음을 통해 공유


BITMAPINFOHEADER 구조체(wingdi.h)

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

BITMAPINFOHEADER 구조체에는 디바이스 독립적 비트맵(DIB)의 차원 및 색 형식에 대한 정보가 포함되어 있습니다.

참고 이 구조체는 GDI 설명서에도 설명되어 있습니다. 그러나 비디오 데이터의 의미 체계는 GDI에 사용되는 의미 체계와 약간 다릅니다. 이 구조를 사용하여 비디오 데이터를 설명하는 경우 여기에 제공된 정보를 사용합니다.
 

구문

typedef struct tagBITMAPINFOHEADER {
  DWORD biSize;
  LONG  biWidth;
  LONG  biHeight;
  WORD  biPlanes;
  WORD  biBitCount;
  DWORD biCompression;
  DWORD biSizeImage;
  LONG  biXPelsPerMeter;
  LONG  biYPelsPerMeter;
  DWORD biClrUsed;
  DWORD biClrImportant;
} BITMAPINFOHEADER, *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

멤버

biSize

구조체에 필요한 바이트 수를 지정합니다. 이 값은 구조의 끝에 추가되는 경우 색 테이블의 크기 또는 색 마스크의 크기를 포함하지 않습니다. 설명 부분을 참조하세요.

biWidth

비트맵의 너비를 픽셀 단위로 지정합니다. 비트맵의 보폭을 계산하는 방법에 대한 자세한 내용은 비고를 참조하세요.

biHeight

비트맵의 높이를 픽셀 단위로 지정합니다.

  • 압축되지 않은 RGB 비트맵의 경우 biHeight 가 양수이면 비트맵은 왼쪽 아래 모서리에 원점이 있는 상향식 DIB입니다. biHeight가 음수이면 비트맵은 왼쪽 위 모서리에 원점이 있는 하향식 DIB입니다.
  • YUV 비트맵의 경우 비트맵은 biHeight의 기호에 관계없이 항상 하향식입니다. 디코더는 양수 biHeight가 있는 YUV 형식을 제공해야 하지만 이전 버전과의 호환성을 위해 양수 또는 음의 biHeight를 사용하여 YUV 형식을 수락해야 합니다.
  • 압축된 형식의 경우 biHeight 는 이미지 방향에 관계없이 양수여야 합니다.

biPlanes

대상 디바이스의 평면 수를 지정합니다. 이 값은 1로 설정해야 합니다.

biBitCount

픽셀당 비트 수(bpp)를 지정합니다. 압축되지 않은 형식의 경우 이 값은 픽셀당 평균 비트 수입니다. 압축된 형식의 경우 이 값은 이미지가 디코딩된 후 압축되지 않은 이미지의 암시적 비트 깊이입니다.

biCompression

압축된 비디오 및 YUV 형식의 경우 이 멤버는 LITTLE-endian 순서로 DWORD 로 지정된 FOURCC 코드입니다. 예를 들어 YUYV 비디오에는 FOURCC 'VYUY' 또는 0x56595559 있습니다. 자세한 내용은 FOURCC 코드를 참조하세요.

압축되지 않은 RGB 형식의 경우 다음 값이 가능합니다.

의미
BI_RGB
압축되지 않은 RGB.
BI_BITFIELDS
색 마스크가 있는 압축되지 않은 RGB입니다. 16bpp 및 32bpp 비트맵에 유효합니다.
 

자세한 내용은 설명 부분을 참조하십시오. BI_JPGBI_PNG 비디오 형식이 잘못되었습니다.

16bpp 비트맵의 경우 biCompressionBI_RGB 같으면 형식은 항상 RGB 555입니다. biCompressionBI_BITFIELDS 같으면 형식은 RGB 555 또는 RGB 565입니다. AM_MEDIA_TYPE 구조체의 하위 형식 GUID를 사용하여 특정 RGB 형식을 확인합니다.

biSizeImage

이미지의 크기(바이트)를 지정합니다. 압축되지 않은 RGB 비트맵의 경우 0으로 설정할 수 있습니다.

biXPelsPerMeter

비트맵에 대한 대상 디바이스의 가로 해상도(미터당 픽셀)를 지정합니다.

biYPelsPerMeter

비트맵에 대한 대상 디바이스의 세로 해상도(미터당 픽셀)를 지정합니다.

biClrUsed

비트맵에서 실제로 사용되는 색 테이블의 색 인덱스 수를 지정합니다. 자세한 내용은 설명 부분을 참조하십시오.

biClrImportant

비트맵을 표시하는 데 중요한 것으로 간주되는 색 인덱스의 수를 지정합니다. 이 값이 0이면 모든 색이 중요합니다.

설명

색 표

BITMAPINFOHEADER 구조 뒤에 색상표 항목 또는 색 마스크의 배열이 뒤따를 수 있습니다. 규칙은 biCompression의 값에 따라 달라집니다.
  • biCompressionBI_RGB 같고 비트맵이 8bpp 이하를 사용하는 경우 비트맵에는 BITMAPINFOHEADER 구조 바로 뒤의 색 테이블이 있습니다. 색 테이블은 RGBQUAD 값의 배열로 구성됩니다. 배열의 크기는 biClrUsed 멤버가 지정합니다. biClrUsed가 0이면 배열에 지정된 비트 패스의 최대 색 수가 포함됩니다. 즉, 2^biBitCount 색입니다.
  • biCompressionBI_BITFIELDS 같은 경우 비트맵은 픽셀의 바이트 레이아웃을 지정하는 세 개의 DWORD 색 마스크(각각 빨간색, 녹색 및 파란색)를 사용합니다. 각 마스크의 1비트 는 픽셀 내의 해당 색에 대한 비트를 나타냅니다.
  • biCompression이 비디오 FOURCC인 경우 색 테이블의 존재는 비디오 형식에 의해 암시됩니다. 비트 깊이가 8 bpp 이하일 때 색 테이블이 있다고 가정해서는 안 됩니다. 그러나 일부 레거시 구성 요소는 색 테이블이 있다고 가정할 수 있습니다. 따라서 BITMAPINFOHEADER 구조를 할당하는 경우 색 테이블이 사용되지 않더라도 비트 깊이가 8bpp 이하인 경우 색 테이블에 대한 공간을 할당하는 것이 좋습니다.
BITMAPINFOHEADER 뒤에 색 테이블 또는 색 마스크 집합이 있는 경우 BITMAPINFO 구조를 사용하여 색 마스크의 색 테이블을 참조할 수 있습니다. BITMAPINFO 구조체는 다음과 같이 정의됩니다.
typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD          bmiColors[1];
} BITMAPINFO;

BITMAPINFOHEADERBITMAPINFO로 캐스팅하는 경우 bmiHeader 멤버는 BITMAPINFOHEADER를 참조하고 bmiColors 멤버는 색 테이블의 첫 번째 항목 또는 첫 번째 색 마스크를 참조합니다.

비트맵에서 색 테이블 또는 색 마스크를 사용하는 경우 전체 형식 구조의 크기(BITMAPINFOHEADER 및 색 정보)는 또는 sizeof(BITMAPINFO)과 같지 sizeof(BITMAPINFOHEADER) 않습니다. 각 instance 대한 실제 크기를 계산해야 합니다.

Surface Stride 계산

압축되지 않은 비트맵에서 stride는 픽셀 한 행의 시작에서 다음 행의 시작까지 이동하는 데 필요한 바이트 수입니다. 이미지 형식은 이미지의 최소 보폭을 정의합니다. 또한 그래픽 하드웨어는 이미지가 포함된 표면에 더 큰 보폭이 필요할 수 있습니다.

압축되지 않은 RGB 형식의 경우 최소 보폭은 항상 이미지 너비(바이트)이며 가장 가까운 DWORD로 반올림됩니다. 보폭 및 이미지 크기를 계산하려면 GDI_DIBWIDTHBYTES 및/또는 GDI_DIBSIZE 매크로 또는 다음 수식을 사용할 수 있습니다.

stride = ((((biWidth * biBitCount) + 31) & ~31) >> 3);
biSizeImage = abs(biHeight) * stride;

YUV 형식의 경우 최소 보폭을 계산하는 일반적인 규칙은 없습니다. 특정 YUV 형식에 대한 규칙을 이해해야 합니다. 가장 일반적인 YUV 형식에 대한 설명은 비디오 렌더링에 권장되는 8비트 YUV 형식을 참조하세요.

디코더 및 비디오 원본은 biWidth가 이미지 너비(픽셀)인 형식을 제안해야 합니다. 비디오 렌더러에 기본 이미지 보폭보다 큰 표면 보폭이 필요한 경우 다음 값을 설정하여 제안된 미디어 형식을 수정합니다.

  • biWidth를 픽셀 단위로 표면 보폭과 동일하게 설정합니다.
  • VIDEOINFOHEADER 또는 VIDEOINFOHEADER2 구조체의 rcTarget 멤버를 이미지 너비와 픽셀 단위로 설정합니다.
그런 다음 비디오 렌더러는 업스트림 핀에서 IPin::QueryAccept를 호출하여 수정된 형식을 제안합니다. 이 메커니즘에 대한 자세한 내용은 동적 형식 변경을 참조하세요.

이미지 버퍼에 안쪽 여백이 있는 경우 패딩을 위해 예약된 메모리에 포인터를 역참조하지 마세요. 이미지 버퍼가 비디오 메모리에 할당된 경우 패딩을 읽을 수 없는 메모리일 수 있습니다.

요구 사항

   
머리글 wingdi.h

추가 정보

DirectShow 구조체

VIDEOINFOHEADER 구조체

VIDEOINFOHEADER2 구조체

비디오 프레임 작업