게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
Opengl 사용하여 윈도우 그려진내용 bmp로 저장
게시물ID : programmer_6225짧은주소 복사하기
작성자 : 이걸나진이
추천 : 0
조회수 : 4428회
댓글수 : 2개
등록시간 : 2014/10/28 19:10:53
옵션
  • 본인삭제금지
컴파일 환경 : 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);
}
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호