将打印机设备上下文保存为图像

时间:2017-07-17 11:45:17

标签: c++ windows printing mfc gdi+

我的代码通过向第三方库提供数据,打印机的设备上下文和边界矩形来打印一些报告。然后,该库将数据呈现到给定的设备上下文中,然后我可以将其发送到打印机。我现在需要保存这个确切的文档,以便用户可以在以后再次打印它。我能想到的最简单的解决方案是将图像文件的设备上下文提供给第三方库,让它绘制到图像中并将图像保存为文件。但结果并不相同。例如,图像中的线条比发送到打印机的线条粗,两条线条之间的线间距增加等等。

我从打印机获得的DC显然具有不同的属性(例如,当以像素为单位测量时,DPI更高,因此尺寸不同)。我试图调整它并根据DPI计算图像的尺寸。

我不明白为什么图像的尺寸与图像的相应DC不同。我用

创建它
CImage Image;
Image.Create(widthAt96Ppi, heightAt96Ppi, 32);
CDC* pDC = CDC::FromHandle(Image.GetDC());

PrinterDC

  • DPI:600/600
  • 打印机直流设备尺寸单位: 4958/7017
  • 打印机的直流尺寸(以像素为单位):4958/7016
  • Bounding rect:4718/6776
  • GetDeviceCaps(ASPECTX)/ GetDeviceCaps(ASPECTY):600/600

ImageDC

  • DPI:96/96
  • 设备中图像直流的尺寸单位:0/0
  • 图像的直径尺寸(以像素为单位):1920/1200
  • 图像尺寸,以像素为单位:793/1122
  • Bounding rect:755/1084
  • GetDeviceCaps(ASPECTX)/ GetDeviceCaps(ASPECTY):36/36

为什么我会得到不同的结果?第三方库只获取CDC指针,因此CDC必须包含导致这些差异的信息。但是我如何调整它们以使结果看起来一样?

解决方案

感谢VTT的回答,我能够使用以下代码修复此问题

CDC memDC;
memDC.CreateCompatibleDC(&PrinterDC);

CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&PrinterDC, PrinterDC.GetDeviceCaps(HORZRES), PrinterDC.GetDeviceCaps(VERTRES));

CBitmap *pOldBitmap = memDC.SelectObject(&bitmap);

memDC.Rectangle(0, 0, PrinterDC.GetDeviceCaps(HORZRES), PrinterDC.GetDeviceCaps(VERTRES));

// draw into memDC here

CImage Image;
Image.Attach(bitmap);
Image.Save(L"path/to/file.png", Gdiplus::ImageFormatPNG);

memDC.SelectObject(pOldBitmap);

1 个答案:

答案 0 :(得分:1)

您的位图看起来与桌面DC兼容。我认为您应该使用CreateCompatibleBitmap方法(或相应的MFC重载,如果有的话)创建图像,为其提供原始打印机DC和尺寸。