您的位置:首页 > 其它

wince下实现拷屏保存为bmp,装载jpg格式图片转成bmp格式图片

2014-01-13 08:36 246 查看
作者:BB高擎天的空间

转自:http://hi.baidu.com/cahbb/item/2758e9db2ff1f7f9cb0c39d4

此文章代码全为网上搜集,找这些代码花了比较长的时间。非常感谢这两个网站,我从他们网上看到的。是不是他们原创已不重要了,因分享就好了。现贴下,供需要人再使用。

使用插曲:在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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: