本文介绍了如何将打印机hdc保存到图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
你好所有
我想将打印机硬盘保存到图像文件,而我从钩子api EndPage()得到的hdc。
代码如下:
bool SaveToBmp(HDC hdc,RECT rc,SIZE ImgDstSize,LPCWSTR lpFilePath)
{
bool bResult = false;
BITMAPINFO bmpInfo = {0};
BYTE * pData = NULL;
SIZE ImgSrcSize = {rc.right - rc.left,rc.bottom - rc.top};
HBITMAP hBmp = NULL;
HGDIOBJ hOldObj = NULL;
HDC hdcMem = NULL;
//初始化位图信息
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = ImgDstSize.cx;
bmpInfo.bmiHeader.biHeight = ImgDstSize.cy;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 24;
//
HANDLE hFile = INVALID_HANDLE_VALUE;
BITMAPFILEHEADER bmFileHeader = {0};
BITMAPINFOHEADER bmInfoHeader = {0};
hdcMem = :: CreateCompatibleDC(NULL);
if(hdcMem == NULL){
goto _EXIT_FUNC;
}
//从内存中获取数据DC
hBmp = CreateDIBSection(hdcMem,& bmpInfo,DIB_RGB_COLORS,reinterpret_cast< VOID **>(& pData),NULL,0 );
if(hBmp == NULL){
goto _EXIT_FUNC;
}
//吸引到内存DC
hOldObj = SelectObject(hdcMem,hBmp);
:: StretchBlt(hdcMem,0,0,ImgDstSize.cx,ImgDstSize.cx,hdc,rc.left,rc.top,ImgSrcSize.cx,ImgSrcSize.cy,SRCCOPY);
DWORD dwbmpSize = ImgDstSize.cx * ImgDstSize.cy * 3;
bmInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
bmInfoHeader.biWidth = ImgDstSize.cx;
bmInfoHeader.biHeight = ImgDstSize.cy;
bmInfoHeader.biPlanes = 1;
bmInfoHeader.biBitCount = 24;
// Bimap文件头为了写bmp文件
bmFileHeader.bfType = 0x4d42; // bmp
bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER);
bmFileHeader.bfSize = bmFileHeader.bfOffBits +((bmInfoHeader.biWidth * bmInfoHeader.biHeight)* 3); /// 3 =(24/8)
hFile = CreateFile(lpFilePath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE){
goto _EXIT_FUNC;
}
DWORD dwWrite = 0;
WriteFile(hFile,& bmFileHeader,sizeof(BITMAPFILEHEADER),& dwWrite,NULL);
WriteFile(hFile,& bmInfoHeader,sizeof(BITMAPINFOHEADER),& dwWrite,NULL);
WriteFile(hFile,pData,dwbmpSize,& dwWrite,NULL);
SelectObject(hdcMem,hOldObj);
bResult = true;
_EXIT_FUNC:
if(hBmp!= NULL){
:: DeleteObject(hBmp);
}
if(hdcMem!= NULL){
:: DeleteObject(hdcMem);
}
if(hFile!= INVALID_HANDLE_VALUE){
CloseHandle(hFile);
}
返回bResult;
}
如果我放入hdc屏幕hdc,该程序可以获取图像,但如果我放入在hdc中挂钩EndPage();该程序保存错误image.why
请给我最好的解决方案。
谢谢你!
解决方案
这篇关于如何将打印机hdc保存到图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!