gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:11:14 31 4
gpt4 key购买 nike

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

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

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

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

打印机DC

  • DPI:600/600
  • 以设备单位表示的打印机直流尺寸:4958/7017
  • 打印机 dc 的尺寸(以像素为单位):4958/7016
  • 边界矩形:4718/6776
  • GetDeviceCaps(ASPECTX)/GetDeviceCaps(ASPECTY):600/600

图像数据中心

  • DPI:96/96
  • 图像的 dc 在设备中的尺寸单位:0/0
  • 图像的 dc 尺寸(以像素为单位):1920/1200
  • 图像尺寸(以像素为单位):793/1122
  • 边界矩形: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);

最佳答案

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

关于c++ - 将打印机设备上下文另存为图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45143426/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com