此文章代码全为网上搜集,找这些代码花了比较长的时间。非常感谢这两个网站,我从他们网上看到的。是不是他们原创已不重要了,因分享就好了。现贴下,供需要人再使用。
使用插曲:在wince的模似器上调试成功了,但在我主机上调文件保存下来了,但就是打不开。后来调了三天也没成。我又换到我别一台副机了,用模似器也可以成。后来又编译好下到开发板上,尽然成功了。哎真想不到,是我那台主机的事情造成的。
http://topic.csdn.net/t/20060722/11/4897419.html#r_achor
http://hi.baidu.com/%B7%C9%D0%F5%B7%C9%B0%A1%B7%C9/blog/item/99c2f30887486626e8248811.html#0
实际调用时代码:
MyhBitmap=CopyScreenToBitmap(nWidth,nHeight);
LoadImageFromFile(const CString &strFileName)
MyhBitmap=LoadImageFromFile(TEXT(" card\\rr.jpg"));//(TCHAR * pFileImage)
Save16BitmapToFile(MyhBitmap,L" card\\10.bmp");
HBITMAP CopyScreenToBitmap(int &nWidth,int &nHeight)
{
// 屏幕和内存设备描述表
HDC hScrDC, hMemDC;
// 位图句柄
HBITMAP hBitmap, hOldBitmap;
// 屏幕分辨率
int xScrn, yScrn;
//为屏幕创建设备描述表
hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn= GetDeviceCaps(hScrDC, VERTRES);
//存储屏幕的长宽
nWidth = xScrn;
nHeight = yScrn;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap(hScrDC, xScrn, yScrn);
// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, xScrn,yScrn,hScrDC, 0, 0, SRCCOPY);
//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 返回位图句柄
return hBitmap;
}
int Save16BitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName)//将截屏所得保存为16位的图片
{
HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
HDC hOffDC=CreateCompatibleDC(hDC);
SelectObject(hOffDC,hBitmap);
BITMAP Bitmap;
GetObject(hBitmap,sizeof(BITMAP),&Bitmap);
HANDLE fh=CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(fh == INVALID_HANDLE_VALUE )
return FALSE;
BITMAPFILEHEADER bfh;
memset(&bfh,0,sizeof(bfh));
bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/;
bfh.bfSize= sizeof(bfh)+2*Bitmap.bmWidth*Bitmap.bmHeight+sizeof(BITMAPFILEHEADER);
bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER);
DWORD dwWritten=0;
WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL);
BITMAPINFOHEADER bih;
memset(&bih,0,sizeof(bih));
bih.biSize=sizeof(bih);
bih.biWidth=Bitmap.bmWidth;
bih.biHeight=Bitmap.bmHeight;
bih.biPlanes=1;
bih.biBitCount=16;
if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) )
{
return FALSE;
}
BITMAPINFO bitmapInfo;
memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) );
bitmapInfo.bmiHeader=bih;
HDC hMemDC=CreateCompatibleDC(hDC);
BYTE *m_lpBitBmp=new BYTE[bfh.bfSize-sizeof(BITMAPFILEHEADER)];
HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,DIB_RGB_COLORS,(void **)&m_lpBitBmp,
NULL,0);
if(hDibBitmap != 0)
{
::SelectObject(hMemDC,hDibBitmap);
BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY);
WriteFile(fh,m_lpBitBmp,bfh.bfSize-sizeof(BITMAPFILEHEADER),&dwWritten,NULL);
}
DeleteObject(hDibBitmap);
DeleteDC(hDC);
DeleteDC(hMemDC);
CloseHandle(fh);
return 1;
}
HBITMAP LoadImageFromFile(const CString &strFileName)
{
IImagingFactory *pImgFactory = NULL;
IImage *pImage = NULL;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
HBITMAP hResult = 0;
if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
(void **)&pImgFactory)))
{
ImageInfo imageInfo;
if (SUCCEEDED(pImgFactory-> CreateImageFromFile(strFileName, &pImage))
&& SUCCEEDED(pImage-> GetImageInfo(&imageInfo)))
{
CWindowDC dc(0);
CDC dcBitmap;
dcBitmap.CreateCompatibleDC(&dc);
hResult = CreateCompatibleBitmap(dc.GetSafeHdc(), imageInfo.Width, imageInfo.Height);
if (hResult) {
HGDIOBJ hOldBitmap = dcBitmap.SelectObject(hResult);
pImage-> Draw(dcBitmap.GetSafeHdc(), CRect(0, 0, imageInfo.Width, imageInfo.Height), NULL);
dcBitmap.SelectObject(hOldBitmap);
}
pImage-> Release();
}
pImgFactory-> Release();
}
CoUninitialize();
return hResult;
}
int Save24BitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName)//将截屏所得保存为24位的图片
{
HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
HDC hOffDC=CreateCompatibleDC(hDC);
SelectObject(hOffDC,hBitmap);
BITMAP Bitmap;
GetObject(hBitmap,sizeof(BITMAP),&Bitmap);
HANDLE fh=CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(fh == INVALID_HANDLE_VALUE )
return FALSE;
BITMAPFILEHEADER bfh;
memset(&bfh,0,sizeof(bfh));
bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/;
bfh.bfSize= sizeof(bfh)+3*Bitmap.bmWidth*Bitmap.bmHeight+sizeof(BITMAPFILEHEADER);
bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER);
DWORD dwWritten=0;
WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL);
BITMAPINFOHEADER bih;
memset(&bih,0,sizeof(bih));
bih.biSize=sizeof(bih);
bih.biWidth=Bitmap.bmWidth;
bih.biHeight=Bitmap.bmHeight;
bih.biPlanes=1;
bih.biBitCount=24;
if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) )
{
return FALSE;
}
BITMAPINFO bitmapInfo;
memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) );
bitmapInfo.bmiHeader=bih;
HDC hMemDC=CreateCompatibleDC(hDC);
BYTE *m_lpBitBmp=new BYTE[3*Bitmap.bmWidth*Bitmap.bmHeight];
HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,DIB_RGB_COLORS,(void **)&m_lpBitBmp,
NULL,0);
if(hDibBitmap != 0)
{
::SelectObject(hMemDC,hDibBitmap);
BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY);
WriteFile(fh,m_lpBitBmp,3*Bitmap.bmWidth*Bitmap.bmHeight,&dwWritten,NULL);
}
DeleteObject(hDibBitmap);
DeleteDC(hDC);
DeleteDC(hMemDC);
CloseHandle(fh);
return 1;
}