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

Save printer device context as image

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

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

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

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

打印机DC

ImageDC

为什么我得到不同的结果?第三方库仅获取 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);

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