|
CString Path; // 읽어 들일 비트맵 경로
HANDLE hFile; // 읽어들일 비트맵 파일 핸들
DWORD fileSize, dwRead; // 비트맵 정보
BITMAPFILEHEADER* bmpFileHeader;// 비트맵 파일헤더 구조체
BITMAPINFOHEADER* bmpInfoHeader;// 비트맵 인포헤서 구조체
long bmpWidth, bmpHeight; // 비트맵 너비 높이
long bmpRealWidth; // 비트맵은 실제로 메모리
RGBTRIPLE* rgbValue; // 비트맵 픽셀 값
Path = odia.GetPathName(); // 파일 경로
// 파일 열기
hFile = CreateFile(LPSTR(LPCTSTR(Path)), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE) {
AfxMessageBox("파일을 읽을 수 없습니다.\n파일을 확인 해 주세요!");
return;
}
fileSize = GetFileSize(hFile, NULL); // 파일사이즈 구함
bmpFileHeader = (BITMAPFILEHEADER*)malloc(fileSize); // 파일 크기만큼 할당
ReadFile(hFile, bmpFileHeader, fileSize, &dwRead, NULL);// 핸들을 이용해 파일을 메모리로 복사
CloseHandle(hFile);
// 비트맵 정보 구조체의 포인터로 전환해 정보구조체를 사용 가능하도록 함
bmpInfoHeader = (BITMAPINFOHEADER*)((PBYTE)bmpFileHeader+sizeof(BITMAPFILEHEADER));
// 비트맵 정보 구조체를 이용해 비트맵의 가로 세로를 구함
bmpWidth = bmpInfoHeader->biWidth;
bmpHeight = bmpInfoHeader->biHeight;
// 비트맵은 실제 메모리에 저장된 데이터는 32비트 단위로 저장되기 때문에 나머지 부분을 맞추기 위해 실제 너비를 구한다.
bmpRealWidth = HBYTES(bmpWidth, 24);
// 비트맵의 실제 픽셀 값의 포인터를 얻음
rgbValue = (RGBTRIPLE*)((PBYTE)bmpFileHeader + bmpFileHeader->bfOffBits);
// 비트맵 픽셀을 참조해서 프로그래밍 함
// 비트맵은 정보가 뒤집어 져 있기 때문에
// 뒤집어서 출력 해야함
unsigned int a, b;
unsigned int size = bmpWidth*bmpHeight;
BYTE *ARGB = new BYTE[size];
b = 0;
for(a=0; a<size; ++a) {
rgbValue = (RGBTRIPLE*)((PBYTE)bmpFileHeader + bmpFileHeader->bfOffBits + a);
ARGB[b] = rgbValue->rgbtBlue;
b++;
ARGB[b] = rgbValue->rgbtGreen;
b++;
ARGB[b] = rgbValue->rgbtRed;
b++;
if(rgbValue->rgbtBlue == 0xFF && rgbValue->rgbtGreen == 0x00 && rgbValue->rgbtRed == 0xFF){
ARGB[b] = 0x00;
b++;
}
else{
ARGB[b] = 0xFF;
b++;
}
}
///// ARGB로 모두 바꿔 사용하려는 데 잘 안돼네요. 도와 주세요.
|