|
그 아이 님이 쓰신 글 :
: 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로 모두 바꿔 사용하려는 데 잘 안돼네요. 도와 주세요.
BYTE* ConvertToRGBA2(AnsiString SourcePath)
{
HANDLE hSourceFile; // 비트맵 파일 핸들
DWORD dwRead; // 비트맵 정보
BITMAPFILEHEADER bmfh; // 비트맵 파일헤더 구조체
BITMAPINFOHEADER bmih; // 비트맵 인포헤서 구조체
long bmpWidth, bmpHeight, x, y; // 비트맵 너비 높이
long bytes_per_scanline; // 비트맵은 실제로 메모리
RGBTRIPLE* pRGBT; // 비트맵 픽셀 값
RGBQUAD *pResultImageRGBQ, *pRGBA, *pLastRGBQLine;
BYTE *pSourceImageData;
// 파일 열기
hSourceFile = CreateFile(SourcePath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hSourceFile == INVALID_HANDLE_VALUE) {
ShowMessage("파일을 읽을 수 없습니다.\n파일을 확인 해 주세요!");
return NULL;
}
ReadFile(hSourceFile, &bmfh, sizeof(bmfh), &dwRead, NULL);// 핸들을 이용해 파일을 메모리로 복사
ReadFile(hSourceFile, &bmih, sizeof(bmih), &dwRead, NULL);
if(bmih.biBitCount!=24){
CloseHandle(hSourceFile);
ShowMessage("24 비트 비트맵 파일이 아님");
return NULL;
}
// 비트맵 정보 구조체를 이용해 비트맵의 가로 세로를 구함
bmpWidth = bmih.biWidth;
bytes_per_scanline = HBYTES(bmpWidth, 24);
bmpHeight = bmih.biHeight;
if(bmpHeight<0) bmpHeight *= -1;
pSourceImageData = new BYTE[bytes_per_scanline*bmpHeight];
SetFilePointer(hSourceFile,bmfh.bfOffBits,NULL,FILE_BEGIN);
ReadFile(hSourceFile, pSourceImageData, bytes_per_scanline*bmpHeight, &dwRead, NULL);
CloseHandle(hSourceFile);
pResultImageRGBQ = new RGBQUAD[bmpWidth*bmpHeight];
pLastRGBQLine = pResultImageRGBQ + bmpWidth*(bmpHeight-1);
for(y=0; y<bmpHeight; y++) {
pRGBT = (RGBTRIPLE*)(pSourceImageData+y*bytes_per_scanline);
if(bmih.biHeight<0) pRGBA = pResultImageRGBQ + y*bmpWidth;
else pRGBA = pLastRGBQLine - y*bmpWidth;
for(x=0; x<bmpWidth; x++) {
pRGBA[x].rgbBlue = pRGBT[x].rgbtBlue;
pRGBA[x].rgbGreen = pRGBT[x].rgbtGreen;
pRGBA[x].rgbRed = pRGBT[x].rgbtRed;
if(pRGBT[x].rgbtBlue == 0xFF && pRGBT[x].rgbtGreen == 0x00 && pRGBT[x].rgbtRed == 0xFF){
pRGBA[x].rgbReserved = 0x00;
}else{
pRGBA[x].rgbReserved = 0xFF;
}
}//for(x
}//for(y
delete[] pSourceImageData;
// 결과 비트맵 데이터는 top-down
return (BYTE*)pResultImageRGBQ;
}
|