关于位图的打印,很多人对此很困惑,在这方面产生的问题也很多,主要包括以下几点。
1:打印的图片太小;
2:根本打印不出来位图
3:打印预览可见、但打印不出来;
产生这些问题的根本原因,在于对位图的理解不够深刻。
一个CBitmap对象,可能是DDB位图(设备相关位图),或者DIB位图(设备无关位图),其中,一个设备兼容的内存DC中,只能选择该设备兼容的DDB位图或者单色的位图。注意,位图只能被选择进入到设备兼容的内存DC中,并不能选择进入到真实的dc中,这就是有时候根本打印不出来图片的原因。
至于打印图片太小的问题,主要是因为衡量位图大小的单位是横向和纵向的像素数,而不是确切的长度,所以如果把一个图片映射到屏幕上,会出现一个比较大的图像,但是打印机的分辨率比屏幕高很多(屏幕一般是96dpi,而打印机最少一般也有300dpi),如果把位图不缩放地映射到打印机上,则必然要小很多。解决该类问题的方法是使用StretchBlt拉伸显示图像。
另外LoadImage函数中使用LR_CREATEDIBSECTION选项产生的DIB位图可以被选择进入任何设备兼容的内存DC中。因此可以使用LoadImage函数加载一个位图文件或者资源,直接把位图通过StretchBlt打印出来。下面是把一个位图文件进行打印的相关代码:
/*
//打印或者在屏幕左上角上画位图文件
//pDC打印机或者屏幕dc指针
iLogPixelX
iLogPixelY
屏幕DC的GetDeviceCaps(LOGPIXELSX)值,其中
iLogPixelX=DC.GetDeviceCaps(LOGPIXELSX);
iLogPixelY=DC.GetDeviceCaps(LOGPIXELSY);
const char *strFileName BMP图片文件名称
*/
voidDrawBMP(CDC* pDC,intiLogPixelX,intiLogPixelY,constchar*strFileName)
{
CDCMemDC;//内存设备环境指针,在视的整个存在过程都将存在
CBitmapBitmap,*pOldBmp;
CRectSource,
Dest;//记录源位图尺寸和最终显示尺寸
BITMAPbm;
if(MemDC.GetSafeHdc() == NULL)
{
HBITMAP
hbitmap=(HBITMAP)LoadImage(0,strFileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
Bitmap.Attach(hbitmap);
MemDC.CreateCompatibleDC(pDC);
Bitmap.GetObject(sizeof(bm),&bm);
pOldBmp=MemDC.SelectObject(&Bitmap);
Source.top=0;
Source.left=0;
Source.right=
bm.bmWidth;
Source.bottom
= bm.bmHeight;
Dest
= Source;
}
pDC->DPtoLP(&Dest);
if(pDC->IsPrinting())
{
Dest.left=(int)(Dest.left*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);
Dest.right=(int)(Dest.right*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);
Dest.top=(int)(Dest.top*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);
Dest.bottom=(int)(Dest.bottom*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);
}
pDC->StretchBlt(Dest.left,
Dest.top, Dest.right, Dest.bottom,
&MemDC,
Source.left, Source.top, Source.right,Source.bottom, SRCCOPY);
MemDC.SelectObject(pOldBmp);
Bitmap.DeleteObject();
MemDC.DeleteDC();
return;
}
但是对于显示设备兼容的DDB位图的打印则不是那么简单,比如屏幕截图,这种位图不能选择进入打印设备兼容的内存DC中,对于这种问题的处理,一般是通过转化成DIB位图,然后使用StretchDIBits函数把位图显示在DC上,下面是一个可以打印任何位图的函数代码
源文档 <http://blog.csdn.net/bqw2008/archive/2008/12/25/3606158.aspx>
分享到:
相关推荐
C#热敏小票打印机打印位图,可以打印条形码和二维码还有简单的图片
VC实现默认打印机打印位图,再别人的基础上改进,通过运行测试的。
VC打印位图,VC+MapX打印地图功能,没有用GDI+。只需要把我的打印方法拷贝到你的类中就能直接运行了,非常简单。
DELPHI 打印文本和位图例程 演示 DELPHI如何用代码实现打印文本字符和image图形。
将位图打印出来,很实用
一个可以打印文字和位图的程序,而且可以对位图打印进行大小方向调整,使用时在file.Open调整位图打印路径,在StretchDIBits中调整打印大小、位置,在_tmain中的PrintDoc中更改自己的打印机的名字即可使用
VC++做的基于对话框的打印,带打印预览、直接打印的MFC程序
基于GDI+位图打印函数 粘贴函数更改路径即用。支持彩色黑白打印等功能
MFC程序,设置打印机打印指定的位图图片,不弹出打印机设置对话框
MFC 载入位图面并显示 可选择改变背景颜色, 选择改变字体 选择改变打印
解决c#打印图片模糊的问题, 程序使用.net framework 4.0开发,不依赖其他软件, 而且是根本解决模糊的问题, 只要是图片都可以清晰打印.
计算机软件-商业源码-158 打印文本和位图.zip
计算机软件-编程源码-8.16 位图的打印.zip
计算机软件-商业源码-8.16 位图的打印.zip
Print transparent bitmap via regions通过区域打印透明的位图(6KB)
vc mfc 对话框 能打印文字(可指定字体字号) 图形(线条椭圆) 位图文件bmp.rar
打印机开源驱动,可用于开发打印机驱动或者图片打印机,通过.inf安装,直接可以安装,测试。是虚拟打印机开发的良好框架。通过运行测试,绝对可以运行。
蓝牙打印指令js
TSC打印机的TSPL2指令集使用说明书 用来指导开发使用 TSC打印机的TSPL中文文档
本文通过打印机在Windows环境下打印流程的基础上, 分析打 印驱动系统的组成和功能,并提出实现基千单片机的打印系统研究的流程。 本课题选用PCL指令的喷墨打印机作为打印系统的研究对象,以打印机相关技术为基础,...