질문과 답변

c++ 비트맵 파일구조 문의드립니다 날짜:2020-2-17 4:33:03 조회수:106
작성자 : 동래감자
포인트 : 7
가입일 : 2020-02-17 16:29:32
방문횟수 : 2
글 1개, 댓글 1개
소개 :
작성글 보기
쪽지 보내기
안녕하세요
 c++로 비트맵 파일을 읽어서 화면에 뿌려보려고 합니다.

비트맵 형식중
RGB555 RGB565 ARGB4444 등등등....여러 포맷이 존재하던데

이 정보는 비트맵 어디를 까봐야 알수 있을까요?

BitmapFileHeader, BitmapInfoHeader 비트맵 구조체 정보로는 알 수 없을까요?

목록보기 삭제 수정 신고 스크랩

소엔 2월18일 6:25:21  

BITMAPINFOHEADER 구조체의 biBitCount 멤버는 픽셀 하나당 할당된 비트수이면 이 값에 따라 색상수가 결정됩니다. 1이면 흑백이고 4이면 2의 4승개인 16색상을 표현할 수 있습니다. biBitCount가 8이면 팔레트를 사용하는 256색상이며 16이면 RGB555 방식의 15비트 색상이되 BMP 파일은 이 포맷으로 되어 있는 예가 거의 없습니다. 요즘은 이런 비트맵이 드물고 보통은 24비트나 32비트의 트루컬러로 되어 있습니다. 비트맵을 읽는다는 것은 결국 화면에 출력하기 위해서인데 이때는 다음 함수를 사용합니다.

int SetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DWORD dwHeight, int XSrc, int YSrc, UINT uStartScan, UINT cScanLines, CONST VOID *lpvBits, CONST BITMAPINFO *lpbmi, UINT fuColorUse);

이 함수의 제일 마지막 인수 fuColorUse는 비트맵 래스터 데이터가 팔레트일 때 DIB_PAL_COLORS로 지정하고 색상값일 때 DIB_RGB_COLORS를 지정합니다. 나머지 포맷 분석은 이 함수 내부에서 색상수를 조사하여 자동으로 결정합니다. DIB를 DDB로 변환할 때는 다음 함수를 사용합니다.

HBITMAP CreateDIBitmap( HDC hdc, CONST BITMAPINFOHEADER *lpbmih, DWORD fdwInit, CONST VOID *lpbInit, CONST BITMAPINFO *lpbmi, UINT fuUsage );

비트맵 관련 구조체와 래스터 정보가 전달되며 마지막 인수 fuUsage로 이 비트맵의 색상 포맷을 알려 줍니다. 대개의 경우 DIB_RGB_COLORS로 전달하면 됩니다. 이렇게 만든 비트맵을 BitBlt로 출력합니다. 이런 포맷 변환을 신경쓰고 싶지 않다면 비트맵을 리소스로 포함시키고 LoadBitmap으로 읽어 BitBlt로 출력하면 되고요.

동래감자 2월18일 10:19:18  

답변감사드립니다

SetDIBitsToDevice 함수는 윈도우 API인것 같더라구요
현재 리눅스 기반으로 개발 중입니다.

소스코드를 올리자면

            FILE* fp;
            fp = fopen(filename,"rb");
            if(fp == NULL)
            {
                DP_ERR("File Open Error\n");
                fclose(fp);
            }

            fread(&hf, sizeof(BitmapFileHeader), 1, fp);
            fread(&ih, sizeof(BitmapInfoHeader), 1, fp);

            long int width = ih.width;
            long int height = ih.height;
            int size = ih.sizeimage;

            unsigned short* image;

            image = (unsigned short*)malloc(size);
            fseek(fp, hf.offbits, SEEK_SET);
            fread(image, size, 1, fp);

image라는 변수에 FILE로 오픈하여 offbits까지 seek를 한 상황입니다. image의 현재주소는 비트맵 이미지에 관한 정보가 시작되는 주소로 알고있습니다.

여기까지 정보로는 이 파일이 RGB555 인지 ARGB8888 인지 등등.. 알수없을까요? 사용되는 비트맵 파일은 16, 24 bitcout등 다양하게 있습니다. 


로그인하셔야 댓글을 달 수 있습니다.