컴파일 환경 : windows -8
컴파일러 : 비주얼스튜디오 2010
----------------
먼저 긴 코드를 올리게 되어 죄송하게생각합니다..
윈도우에 opengl 로 그려진 내용들을 bmp 파일로 저장하려고하는데
우선..저장은 아주 잘됩니다만
그림판으로 열었을때 파랑색과 빨강색이 반전됩니다.
아...픽셀값 다바꾸고 뭘해봐도 제 한계를 벗어나서 모르겠습니다;;
혹시라도 gl 마스터분들이 계시다면 ..하는생각에 조심스레 올려봅니다.
--------------------------
//saveBmp : 윈도우에 그려진 내용을 bmp 파일로 저장.
// 인풋파라미터 : 파일명
void CGLInterface::SaveBMP(LPCWSTR fname)
{
//이미지 좌표 계산용
int width = 0;
int height = 0;
///////////////////
GLbyte *pPixelCompo = NULL; //프런트 버퍼의 픽셀값들을 얻어 오기 위한 버퍼의 포인터
HANDLE hSaveFile = NULL; //저장용 파일 핸들
BITMAPFILEHEADER BMFH; //비트맵 파일 처리를 위한 헤더 구조체
BITMAPINFOHEADER BMIH;
DWORD RealWidthBytes = 0; //비트맵 파일의 가로열이 소유하는 실제 바이트
DWORD dwWrite = 0; //파일에 기재한 데이터의 량
//이미지 영역 좌표를 이용하여 실제 이미지의 사이즈를 계산하자
width = curVPSizeX;
height = curVPSizeY;
RealWidthBytes = (width*3%4) ? //이미지의 실제 가로 길이 계산 (compare ? true:false 비교식)
((width*3) + (4 - (width*3%4))) //가로 길이가 4의 배수가 아님
:(width*3); //가로 길이가 4의 배수
//프런트 버퍼로 부터 픽셀 정보들을 얻어온다.
pPixelCompo = (GLbyte *) malloc(width * 4 * height );
glReadPixels(0, 0, //캡처할 영역의 좌측상단 좌표
width, height, //캡처할 영역의 크기
GL_RGB, //캡처한 이미지의 픽셀 포맷
GL_UNSIGNED_BYTE, //캡처한 이미지의 데이터 포맷
pPixelCompo); //캡처한 이미지의 정보를 담아둘 버퍼 포인터
//이제부터 본격적인 세이브 작업 시작
hSaveFile = CreateFile( //24bit 포맷 BMP파일을 저장하기 위한 파일 핸들 준비
fname,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
//비트맵 파일 헤더 처리
BMFH.bfType = 0x4d42;
BMFH.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (RealWidthBytes * height);
BMFH.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
WriteFile(hSaveFile, &BMFH, sizeof(BITMAPFILEHEADER), &dwWrite, NULL);
//비트맵 인포 헤더 처리
BMIH.biBitCount = 24;
BMIH.biClrImportant = 0;
BMIH.biClrUsed = 0;
BMIH.biCompression = BI_RGB;
BMIH.biHeight = height;
BMIH.biPlanes = 1;
BMIH.biSize = sizeof(BITMAPINFOHEADER);
BMIH.biSizeImage = height * width;
BMIH.biWidth = width;
BMIH.biXPelsPerMeter = 0;
BMIH.biYPelsPerMeter = 0;
WriteFile(hSaveFile, &BMIH, sizeof(BITMAPINFOHEADER), &dwWrite, NULL);
//이미지 픽셀값 처리
WriteFile(hSaveFile, pPixelCompo, (RealWidthBytes * height), &dwWrite, NULL);
//작업 뒷정리
CloseHandle(hSaveFile);
free(pPixelCompo);
}