为什么在内存中获得的bmp文件保存起来后再读取会失真?解决方案
为什么在内存中获得的bmp文件保存起来后再读取会失真?
1.先用BitBlt取得原始bmp文件中的某一块。
-------------------------------
CBitmap* bmp=new CBitmap;
HBITMAP hbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),path,
IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
bmp-> Attach(hbmp);
//CDC对象生成
CDC *p_MDC1 = new CDC;
CDC *p_MDC2 = new CDC;
//CBitmap指针对象生成
CBitmap *pOldBt1, *pOldBt2;
CBitmap *bmPtr = new CBitmap;
CClientDC dc(NULL);
p_MDC2-> CreateCompatibleDC(&dc);
pOldBt2=p_MDC2-> SelectObject(/*pBitmap*/bmp);
p_MDC1-> CreateCompatibleDC(&dc);
//生成新位图
bmPtr-> CreateCompatibleBitmap(&dc,divWidth,divHeight);
//将新位图选入CDC对象中
pOldBt1=p_MDC1-> SelectObject(bmPtr);
p_MDC1-> BitBlt(0, 0, divWidth, divHeight, p_MDC2,cx,cy,SRCCOPY);
p_MDC1-> SelectObject(pOldBt1);
p_MDC1-> DeleteDC();
p_MDC2-> SelectObject(pOldBt2);
p_MDC2-> DeleteDC();
//返回CBitmap对象
BITMAP bitmap;
bmPtr-> GetBitmap(&bitmap);
HBITMAP hbit=(HBITMAP)(*bmPtr);
SaveBmp(hbit, "test3.bmp ");
---------------------------
2。然后调用SaveBmp将分割后的文件保存到本地。
------------------------------------
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;
1.先用BitBlt取得原始bmp文件中的某一块。
-------------------------------
CBitmap* bmp=new CBitmap;
HBITMAP hbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),path,
IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
bmp-> Attach(hbmp);
//CDC对象生成
CDC *p_MDC1 = new CDC;
CDC *p_MDC2 = new CDC;
//CBitmap指针对象生成
CBitmap *pOldBt1, *pOldBt2;
CBitmap *bmPtr = new CBitmap;
CClientDC dc(NULL);
p_MDC2-> CreateCompatibleDC(&dc);
pOldBt2=p_MDC2-> SelectObject(/*pBitmap*/bmp);
p_MDC1-> CreateCompatibleDC(&dc);
//生成新位图
bmPtr-> CreateCompatibleBitmap(&dc,divWidth,divHeight);
//将新位图选入CDC对象中
pOldBt1=p_MDC1-> SelectObject(bmPtr);
p_MDC1-> BitBlt(0, 0, divWidth, divHeight, p_MDC2,cx,cy,SRCCOPY);
p_MDC1-> SelectObject(pOldBt1);
p_MDC1-> DeleteDC();
p_MDC2-> SelectObject(pOldBt2);
p_MDC2-> DeleteDC();
//返回CBitmap对象
BITMAP bitmap;
bmPtr-> GetBitmap(&bitmap);
HBITMAP hbit=(HBITMAP)(*bmPtr);
SaveBmp(hbit, "test3.bmp ");
---------------------------
2。然后调用SaveBmp将分割后的文件保存到本地。
------------------------------------
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;