HBITMAP 에서 BMP 파일로 추출 ¶
~cpp //********************************************************************* // CImageTool::ExportAsBMP() // Purpose: [CBitmap에 저장되어있는 이미지를 Bmp파일로 만든다.] // Parameters: // [type] : 1 픽셀당 Bit 수 // [*filename] : 만들어질 bmp파일이름 // [*pDC] : Device Context // [hBitmap] : 이미지가 저장되어 있는 CBitmap (HBITMAP으로 변화하여 사용) // [nWidth] : 이미지의 넓이 // [nHeight] : 이미지의 높이 // Returns: BOOL //********************************************************************* BOOL CImageTool::ExportAsBMP(int type, char *filename, CDC *pDC, HBITMAP hBitmap, int nWidth, int nHeight) { BYTE *bmp; BITMAPFILEHEADER header; FILE *fp; unsigned int size, palsize; BOOL r = FALSE; if ((bmp=GetBMP(type, nWidth, nHeight, hBitmap, pDC->m_hDC, &size)) == NULL) return FALSE; if (type != 3) palsize = 1<<bit[type]; else palsize = 0; header.bfType = 0x4D42; header.bfSize = size+sizeof(BITMAPFILEHEADER); header.bfReserved1 = header.bfReserved2=0; header.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*palsize; if ((fp=fopen(filename,"wb")) == NULL) { free(bmp); return FALSE; } if (fwrite(&header,sizeof(BITMAPFILEHEADER),1,fp)!=0) if (fwrite(bmp,size,1,fp)!=0) r=TRUE; free(bmp); fclose(fp); return r; } //******************************************************************* // *CImageTool::GetBMP() // Purpose: [주어진 HBITMAP에서 이미지 정보를 읽어 오는 함수] // Parameters: // [type] : 1픽셀당 Bit수 // [w] : 이미지 넓이 // [h] : 이미지 높이 // [hBitmap] : 이미지가 저장되어있는 CBtimap // [hdc] : Device Context // [*size] : File Size (반환되는 값) // Returns: BYTE //******************************************************************* BYTE *CImageTool::GetBMP(int type, int w, int h, HBITMAP hBitmap, HDC hdc, unsigned int *size) { LPBITMAPINFO lpvBits; BYTE *lpbi; int width,palsize; if (type!=3) palsize = 1<<bit[type]; else palsize = 0; width = ((((w*bit[type]+7)/8+3)/4)*4); *size = sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*palsize+width*h; lpvBits = (BITMAPINFO *)malloc(*size); lpbi = (BYTE *)lpvBits+sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*palsize; lpvBits->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpvBits->bmiHeader.biWidth = w; lpvBits->bmiHeader.biHeight = h; lpvBits->bmiHeader.biPlanes = 1; lpvBits->bmiHeader.biBitCount = bit[type]; lpvBits->bmiHeader.biCompression = BI_RGB; lpvBits->bmiHeader.biSizeImage = width*h; lpvBits->bmiHeader.biXPelsPerMeter = 0; lpvBits->bmiHeader.biYPelsPerMeter = 0; lpvBits->bmiHeader.biClrUsed = 1<<bit[type]; lpvBits->bmiHeader.biClrImportant = 1<<bit[type]; GetDIBits(hdc,hBitmap,0,h,lpbi,lpvBits,DIB_RGB_COLORS); return (BYTE *)lpvBits; }
출처:GOSU.NET