BMP 파일의 구조 상관없이 이미지 데이터를 읽어서 출력하고 싶었다
나중에 복붙해서 사용할 용도이기도 하다
컬러비트가 다르거나 BITMAPINFOHEADER의 크기가 달라도 32비트 이미지 데이터형식으로 읽어오도록 코드를 작성했다
char* imgData;
int width;
int height;
int colorByte;
int pitch;
int imgSize;
bool LoadDib32Bit(const wchar_t* fileName)
{
FILE* file;
if (_wfopen_s(&file, fileName, L"rb") != 0)
return false;
BITMAPFILEHEADER bmfh;
fread_s(&bmfh, sizeof(bmfh), sizeof(bmfh), 1, file);
if (bmfh.bfType != 0x4d42)
return false;
BITMAPINFOHEADER bmih;
fread_s(&bmih, sizeof(bmih), sizeof(bmih), 1, file);
// 이미지를 32비트 데이터 형식으로 저장
width = bmih.biWidth;
height = bmih.biHeight;
colorByte = 4;
pitch = width * 4;
imgSize = pitch * height;
int imgColorByte = bmih.biBitCount >> 3;
int imgPitch = width * imgColorByte + 3 & ~3;
imgData = new char[imgSize];
memset(imgData, 0, imgSize);
char* buf = new char[imgPitch];
// 이미지 데이터의 시작위치로 이동
_fseeki64(file, bmfh.bfOffBits, SEEK_SET);
// 이미지 상하 반전 저장
char* dest = imgData + imgSize - pitch;
for (int i = 0; i < height; i++)
{
fread_s(buf, imgPitch, imgPitch, 1, file);
int* curDest = (int*)dest;
char* curBuf = buf;
for (int j = 0; j < width; j++)
{
memcpy_s(curDest, 4, curBuf, imgColorByte);
++curDest;
curBuf += imgColorByte;
}
dest -= pitch;
}
delete[] buf;
fclose(file);
return true;
}
좀 더 최적화 시킬 수 있을 것 같은데 새벽 2시라 일단 자련다 ... zzz
반응형
'공부' 카테고리의 다른 글
20200916 공부 (0) | 2020.09.16 |
---|---|
Console창 생성 및 출력 (0) | 2020.09.15 |
20200905 공부 (0) | 2020.09.05 |
20200904 공부 (0) | 2020.09.04 |
20200903 공부 (0) | 2020.09.03 |