打印位图(上)

原创 2004年01月14日 11:06:00

       关于位图的打印,很多人对此很困惑,在这方面产生的问题也很多,主要包括以下几点。

       1:打印的图片太小;

       2:根本打印不出来位图

       3:打印预览可见、但打印不出来;

       产生这些问题的根本原因,在于对位图的理解不够深刻。

       一个CBitmap对象,可能是DDB位图(设备相关位图),或者DIB位图(设备无关位图),其中,一个设备兼容的内存DC中,只能选择该设备兼容的DDB位图或者单色的位图。注意,位图只能被选择进入到设备兼容的内存DC中,并不能选择进入到真实的dc中,这就是有时候根本打印不出来图片的原因。

       至于打印图片太小的问题,主要是因为衡量位图大小的单位是横向和纵向的像素数,而不是确切的长度,所以如果把一个图片映射到屏幕上,会出现一个比较大的图像,但是打印机的分辨率比屏幕高很多(屏幕一般是96dpi,而打印机最少一般也有300dpi),如果把位图不缩放地映射到打印机上,则必然要小很多。解决该类问题的方法是使用StretchBlt拉伸显示图像。

       另外LoadImage函数中使用LR_CREATEDIBSECTION选项产生的DIB位图可以被选择进入任何设备兼容的内存DC中。因此可以使用LoadImage函数加载一个位图文件或者资源,直接把位图通过StretchBlt打印出来。下面是把一个位图文件进行打印的相关代码:

/*<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

//打印或者在屏幕左上角上画位图文件

//pDC 打印机或者屏幕dc指针

iLogPixelX

iLogPixelY

屏幕DCGetDeviceCaps(LOGPIXELSX)值,其中

iLogPixelX=DC.GetDeviceCaps(LOGPIXELSX);

iLogPixelY=DC.GetDeviceCaps(LOGPIXELSY);

const char *strFileName BMP图片文件名称

*/

void DrawBMP(CDC* pDC,int iLogPixelX,int iLogPixelY,const char *strFileName)

{

         CDC          MemDC; // 内存设备环境指针,在视的整个存在过程都将存在

         CBitmap         Bitmap,*pOldBmp;      

         CRect                Source, Dest; // 记录源位图尺寸和最终显示尺寸

         BITMAP         bm;

         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上,下面是一个可以打印任何位图的函数代码。

iOS 热敏打印机打印位图

需求是希望通过ipad和iPhone连接局域网内的打印机打印餐馆小票,而小票中需要包含logo图片和二维码。我用的打印机是xprinter,根据开发文档提示,打印位图的命令是“ESC*mnLnHd1....
  • xjmeplws
  • xjmeplws
  • 2015年02月10日 16:18
  • 2261

C#并口热敏小票打印机打印位图

最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了。   这是DEMO的窗体:   下面是打印所需要调用的代码: class LptControl ...
  • laner0515
  • laner0515
  • 2013年01月01日 15:34
  • 14937

C#并口热敏小票打印机打印位图

最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了。   这是DEMO的窗体:   下面是打印所需要调用的代码: class LptControl ...
  • beyondqd
  • beyondqd
  • 2013年01月02日 09:26
  • 1285

Print transparent bitmap via regions通过区域打印透明的位图(6

  • 2006年02月23日 09:05
  • 6KB
  • 下载

将对话框上显示的位图打印出来

  • 2016年11月04日 11:33
  • 1.81MB
  • 下载

打印手机摄像头的支持参数+将预览帧转换为位图+获取最佳预览

打印手机摄像头的支持参数+将预览帧转换为位图 public class SecondActivity extends Activity implements SurfaceHolder.Callba...
  • panda1234lee
  • panda1234lee
  • 2013年03月23日 21:29
  • 1360

VC 打印位图的最新实现例子

#pragma comment(lib, "winspool.lib") #include "stdafx.h" #include   HANDLE m_hBitmap; /// TCHAR ...
  • xbsoul
  • xbsoul
  • 2017年01月03日 10:25
  • 771

Bitmap转为单色位图,打印电子签名

背景项目中使用手写板,用户在上面签名后,将电子签名传到后台,同时将签名连同别的信息打印出来。手写板已经有很多优秀的开源库,也可以动手撸一个。手写板签名后可以得到签名的Bitmap,而所用的硬件是有打印...
  • recordGrowth
  • recordGrowth
  • 2017年11月10日 21:22
  • 211

第十五章 与设备无关的位图(显示和打印3)

缩放到合适尺寸SetDIBitsToDevice完成了将DIB的图素对点送入输出设备的显示程序。这对于打印DIB用处不大。打印机的分辨率越高,得到的图像就越小,您最终会得到如邮票大小的图像。要通过缩小...
  • xmcai123
  • xmcai123
  • 2011年04月22日 01:39
  • 288

常用点位图

  • 2016年04月22日 13:56
  • 1.14MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:打印位图(上)
举报原因:
原因补充:

(最多只允许输入30个字)