怎样把剪贴板上的位图存为BMP文件????急救 无聊。粘贴到绘图中,然后保存不就行了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 刚好有现成的代码:HBITMAP bitmap;OpenClipboard();bitmap=(HBITMAP)GetClipboardData(CF_BITMAP);CloseClipboard();SaveToBmp(bitmap,"c:\\test.bmp");#include "math.h"BOOL SaveToBmp(HBITMAP hBitmap,const char *szBmpFile){ BITMAP bm; PBITMAPINFO bmpInf; BOOL bRet=FALSE; int nPaletteSize=0; if(GetObject(hBitmap,sizeof(bm),&bm)==0) return FALSE; if(bm.bmBitsPixel<16) nPaletteSize=pow(2,bm.bmBitsPixel); bmpInf=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*nPaletteSize); if(bmpInf==NULL) { return FALSE; } //----------------------------------------------- bmpInf->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInf->bmiHeader.biWidth = bm.bmWidth; bmpInf->bmiHeader.biHeight = bm.bmHeight; bmpInf->bmiHeader.biPlanes = bm.bmPlanes; bmpInf->bmiHeader.biBitCount = bm.bmBitsPixel; bmpInf->bmiHeader.biCompression = BI_RGB; bmpInf->bmiHeader.biSizeImage = (bm.bmWidth+7)/8*bm.bmHeight*bm.bmBitsPixel; bmpInf->bmiHeader.biXPelsPerMeter = 0; bmpInf->bmiHeader.biYPelsPerMeter = 0; bmpInf->bmiHeader.biClrUsed = 0; bmpInf->bmiHeader.biClrImportant = 0; //----------------------------------------------- void* buf=(void*) new char[bmpInf->bmiHeader.biSizeImage]; if(buf==NULL) { LocalFree(bmpInf); return FALSE; } if(!::GetDIBits(GetWindowDC(NULL),hBitmap,0,(WORD)bm.bmHeight,buf,bmpInf,DIB_RGB_COLORS)) { delete []buf; LocalFree(bmpInf); return FALSE; } BITMAPFILEHEADER bmFHeader; bmFHeader.bfType=0x4d42; bmFHeader.bfReserved1=0; bmFHeader.bfReserved2=0; bmFHeader.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+bmpInf->bmiHeader.biSize+ nPaletteSize*sizeof(RGBQUAD)); bmFHeader.bfSize=(DWORD)(bmFHeader.bfOffBits+bmpInf->bmiHeader.biSizeImage); DWORD dwTemp; HANDLE hFile; hFile=CreateFile(szBmpFile,GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); while(hFile!=INVALID_HANDLE_VALUE) { //写BITMAPFILEHEADER if(WriteFile(hFile,&bmFHeader,sizeof(BITMAPFILEHEADER),&dwTemp,NULL)==0) break; //写BITMAPINFOHEADER if(WriteFile(hFile,&bmpInf->bmiHeader,bmpInf->bmiHeader.biSize,&dwTemp,NULL)==0) break; //写调色板数据(可能有) if(WriteFile(hFile,&bmpInf->bmiColors,nPaletteSize*sizeof(RGBQUAD),&dwTemp,NULL)==0) break; //写图像数据 DWORD dwLen=bmpInf->bmiHeader.biSizeImage; BYTE *pTemp=(BYTE*)buf; while(dwLen>=65535) { if(WriteFile(hFile,pTemp,65535,&dwTemp,NULL)==0) { dwLen=0xffffffff; break; } dwLen-=65535; pTemp+=65535; } if(dwLen==0xffffffff) break; if((dwLen>0)&&(WriteFile(hFile,pTemp,dwLen,&dwTemp,NULL)==0)) break; bRet=TRUE; break;//必须的 } if(hFile!=INVALID_HANDLE_VALUE) { CloseHandle(hFile); } delete []buf; LocalFree(bmpInf); return bRet;} 如何用CStatic中Create一个GroupBox? ActiveX控件的刷新问题?高手请进! 哪位高人给小弟点指教,我刚刚学VC 文件操作 谁能提供一些内存碎片整理方面的资料? 请教 bayer转24位RGB模式 快快快!!!!!!!!!!!!!帮我改一下程序 MFC界面求助 这是一种什么样子的书写规范? MFC画图程序,拖动对话框重影 简单问题,CFont怎么用 问一个关于VC十分白痴的问题!!
OpenClipboard();
bitmap=(HBITMAP)GetClipboardData(CF_BITMAP);
CloseClipboard();
SaveToBmp(bitmap,"c:\\test.bmp");#include "math.h"
BOOL SaveToBmp(HBITMAP hBitmap,const char *szBmpFile)
{
BITMAP bm;
PBITMAPINFO bmpInf;
BOOL bRet=FALSE;
int nPaletteSize=0; if(GetObject(hBitmap,sizeof(bm),&bm)==0)
return FALSE; if(bm.bmBitsPixel<16)
nPaletteSize=pow(2,bm.bmBitsPixel); bmpInf=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+
sizeof(RGBQUAD)*nPaletteSize);
if(bmpInf==NULL)
{
return FALSE;
}
//-----------------------------------------------
bmpInf->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInf->bmiHeader.biWidth = bm.bmWidth;
bmpInf->bmiHeader.biHeight = bm.bmHeight;
bmpInf->bmiHeader.biPlanes = bm.bmPlanes;
bmpInf->bmiHeader.biBitCount = bm.bmBitsPixel;
bmpInf->bmiHeader.biCompression = BI_RGB;
bmpInf->bmiHeader.biSizeImage = (bm.bmWidth+7)/8*bm.bmHeight*bm.bmBitsPixel;
bmpInf->bmiHeader.biXPelsPerMeter = 0;
bmpInf->bmiHeader.biYPelsPerMeter = 0;
bmpInf->bmiHeader.biClrUsed = 0;
bmpInf->bmiHeader.biClrImportant = 0;
//-----------------------------------------------
void* buf=(void*) new char[bmpInf->bmiHeader.biSizeImage];
if(buf==NULL)
{
LocalFree(bmpInf);
return FALSE;
}
if(!::GetDIBits(GetWindowDC(NULL),hBitmap,0,(WORD)bm.bmHeight,buf,bmpInf,DIB_RGB_COLORS))
{
delete []buf;
LocalFree(bmpInf);
return FALSE;
}
BITMAPFILEHEADER bmFHeader;
bmFHeader.bfType=0x4d42;
bmFHeader.bfReserved1=0;
bmFHeader.bfReserved2=0;
bmFHeader.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+bmpInf->bmiHeader.biSize+
nPaletteSize*sizeof(RGBQUAD));
bmFHeader.bfSize=(DWORD)(bmFHeader.bfOffBits+bmpInf->bmiHeader.biSizeImage); DWORD dwTemp;
HANDLE hFile;
hFile=CreateFile(szBmpFile,GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL);
while(hFile!=INVALID_HANDLE_VALUE)
{
//写BITMAPFILEHEADER
if(WriteFile(hFile,&bmFHeader,sizeof(BITMAPFILEHEADER),&dwTemp,NULL)==0)
break;
//写BITMAPINFOHEADER
if(WriteFile(hFile,&bmpInf->bmiHeader,bmpInf->bmiHeader.biSize,&dwTemp,NULL)==0)
break;
//写调色板数据(可能有)
if(WriteFile(hFile,&bmpInf->bmiColors,nPaletteSize*sizeof(RGBQUAD),&dwTemp,NULL)==0)
break; //写图像数据
DWORD dwLen=bmpInf->bmiHeader.biSizeImage;
BYTE *pTemp=(BYTE*)buf;
while(dwLen>=65535)
{
if(WriteFile(hFile,pTemp,65535,&dwTemp,NULL)==0)
{
dwLen=0xffffffff;
break;
}
dwLen-=65535;
pTemp+=65535;
}
if(dwLen==0xffffffff)
break; if((dwLen>0)&&(WriteFile(hFile,pTemp,dwLen,&dwTemp,NULL)==0))
break; bRet=TRUE; break;//必须的
}
if(hFile!=INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
} delete []buf;
LocalFree(bmpInf);
return bRet;
}