공부

BMP 파일 이미지 데이터 읽기

글로벌디노 2020. 9. 13. 01:58

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