永发信息网

在VC++中如何保存图像

答案:3  悬赏:0  手机版
解决时间 2021-11-19 02:47
在VC++中如何保存图像
最佳答案

//保存位图
int   SaveBitmap(HBITMAP   hBitmap,   LPSTR   lpFileName)   
{   
//lpFileName   为位图文件名   
HDC           hDC;                     
//设备描述表   
int           iBits;               
    //当前显示分辨率下每个像素所占字节数   
WORD         wBitCount;         
//位图中每个像素所占字节数   
//定义调色板大小,   位图中像素字节大小   ,     位图文件大小   ,   写入文件字节数   
DWORD                       dwPaletteSize=0,dwBmBitsSize,dwDIBSize,   dwWritten;   
BITMAP                     Bitmap;                   
//位图属性结构   
BITMAPFILEHEADER       bmfHdr;                   
//位图文件头结构   
BITMAPINFOHEADER       bi;                           
//位图信息头结构     
LPBITMAPINFOHEADER   lpbi;                       
//指向位图信息头结构   
HANDLE                     fh,   hDib,   hPal;   
HPALETTE           hOldPal=NULL;   
//定义文件,分配内存句柄,调色板句柄   

//计算位图文件每个像素所占字节数   
iBits=24;   
if   (iBits   <=   1)   
wBitCount   =   1;   
else   if   (iBits   <=   4)   
wBitCount   =   4;   
else   if   (iBits   <=   8)   
wBitCount   =   8;   
else   if   (iBits   <=   32)   
wBitCount   =   24;   
//计算调色板大小   
if   (wBitCount   <=   8)   
dwPaletteSize=(1<
//设置位图信息头结构   
GetObject(hBitmap,   sizeof(BITMAP),   (LPSTR)&Bitmap);   
bi.biSize                         =   sizeof(BITMAPINFOHEADER);   
bi.biWidth                       =   Bitmap.bmWidth;   
bi.biHeight                     =Bitmap.bmHeight;   
bi.biPlanes                     =   1;   
bi.biBitCount                   =   wBitCount;   
bi.biCompression             =   BI_RGB;   
bi.biSizeImage                 =   0;   
bi.biXPelsPerMeter           =   0;   
bi.biYPelsPerMeter           =   0;   
bi.biClrUsed                   =   0;   
bi.biClrImportant             =   0;   
    
dwBmBitsSize   =   ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;   

//为位图内容分配内存   
hDib     =   GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));   
lpbi   =   (LPBITMAPINFOHEADER)GlobalLock(hDib);   
*lpbi   =   bi;   
//   处理调色板         
hPal   =   GetStockObject(DEFAULT_PALETTE);   
if   (hPal)   
{   
hDC   =   GetDC(NULL);   
hOldPal=SelectPalette(hDC,(HPALETTE)hPal,FALSE);   
RealizePalette(hDC);   
}   
//   获取该调色板下新的像素值   
GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize,   (BITMAPINFO   *)lpbi,DIB_RGB_COLORS);   
//恢复调色板         
if   (hOldPal)   
{   
SelectPalette(hDC,   hOldPal,   TRUE);   
RealizePalette(hDC);   
ReleaseDC(NULL,   hDC);   
}   
//创建位图文件           
fh=CreateFile(lpFileName,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL   |   FILE_FLAG_SEQUENTIAL_SCAN,   NULL);   
if   (fh==INVALID_HANDLE_VALUE)   
return   FALSE;   
//   设置位图文件头   
bmfHdr.bfType   =   0x4D42;     //   "BM"   
dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;       
bmfHdr.bfSize   =   dwDIBSize;   
bmfHdr.bfReserved1   =   0;   
bmfHdr.bfReserved2   =   0;   
bmfHdr.bfOffBits   =   (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;   
//   写入位图文件头   
WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);   
//   写入位图文件其余内容   
WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,     
        &dwWritten,   NULL);   
//清除         
GlobalUnlock(hDib);   
GlobalFree(hDib);   
CloseHandle(fh);   
return   TRUE;   
}
全部回答
问题不明觉厉
查一下msdn中的fwrite
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
急需一首关于夏日的诗
马黄进过高温会死啊
35万的车每年保险费要多少
3.6x-x=3.25
芗城区一度电多少?一度电费多少钱
《金牌调解》这类的节目意义何在?
变压器25号油和45号油,能不能混合使用?已经
有没有可以推荐的小巧迷你充电宝?
求圆台展开后的扇形的半径和角度
40岁女性心电图ST段低平怎么回事
超市卖的炒熟的黑豆有营养吗
当运放的信号电压v1=20mv时,测得输出电压v0=4
简便计算 2.25×101-22.5
康庭体育会所地址在哪,我要去那里办事,
被除数是555商是37除数是多少
推荐资讯
施溪村地址在哪,我要去那里办事,
成立旅行社需要哪些环节
4块一起超威6-evf-32多少钱一组
MATLAB里的不等于用什么表示?
最佳阵容空前场用3133教练有用吗
铸造应力有哪几种 怎样区别铸件裂纹的性质 从
dnf公会火戒指适合哪
新汾周边环境怎么样?生活便利吗?
卓敬公哥哥叫什么
影评分几方面来写?
经岁月洗礼的刺猬紫檀需多久成材
宏碁(acer)AS4741G。。2.53GHz i3 M380 2G
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?