使用带有 PostScript 驱动程序的 GDI+ 图像质量差

Bad quality of images using GDI+ with PostScript driver

我正在开发一个程序,使用 C++ 和 Windows GDI+ 在 HDC 上打印不同格式(BMP、JPEG、EMF 等)的图像。使用 MS Publisher 照排机驱动程序,我可以生成一个 postscript 文件,并通过 GhostScript 函数获得 PDF 文件。如果我尝试打印以下图像:

我用那些奇怪的方块(原始图像上不存在)获得了以下质量差的结果:

我用来打印图像的代码部分是:

SetMapMode(hdcPrint,MM_TEXT);
Gdiplus::Graphics graphics(hdcPrint);
graphics.SetPageUnit(Gdiplus::UnitMillimeter);
Gdiplus::Image* image = Gdiplus::Image::FromFile(srPicture->swPathImage); 
graphics.DrawImage(image,x,y,w,h);

我尝试使用多种驱动程序和不同类型的格式(不同于 PostScript:PDF、EMF、真实打印机)打印相同的图像,结果总是可以接受的(不存在方块)。 此外,我尝试使用不同于 Adob​​e Acrobat Reader DC(Wondershare PDFelement 和 Chrome)的 pdf reader 打开质量差的结果,即使这样,结果也是可以接受的。 我还注意到,如果图像包含一些不同的形状(即一条大红线,如下图所示),结果也不错。

此时,我不知道问题出在 Adob​​e reader 还是我的实现上。 使用 GDI+(或纯 GDI)打印不同格式的图像有不同的方法吗?

生成的 PostScript 文件是 this

嗯...您没有提供 PostScript 或 PDF 文件,因此很难发表评论。

我不太清楚你在什么时候得到你显示的图像,这是你在 PDF 文件上看到的吗?将 PDF 文件打印到物理打印机时,您得到了什么吗?如果是后者,您如何将 PDF 文件打印到打印机?

您提供 link 的 JPEG 非常小 (6Kb),您真的要使用该 JPEG 文件吗?

我的猜测(在没有任何文件的情况下,只能猜测)您使用的是旧版本的 Ghostscript。旧版本会解压缩 JPEG 图像,然后使用产生最小结果的任何过滤器重新压缩图像,通常再次使用 JPEG。

由于 JPEG 是一种有损格式,每次将其应用于图像时质量都会下降。

较新版本的 Ghostscript 在转到 pdfwrite 设备时不会解压缩 JPEG 图像数据,除非其他选项(例如颜色转换、图像下采样等)使它成为必要。 Ghostscript 当前版本为 9.27,9.28 即将发布,建议您尝试其中之一。

另一种可能是 PostScript 程序的创建方式是将每个图像样本退化为矩形,或者您正在使用 非常 的旧版本Ghostscript 也使用了该技术。

请注意,在我看来,其中的 none 会导致您在此处粘贴的结果完全相同,但该版本当然值得研究。发布 PostScript 程序文件(即您发送给 Ghostscript 的文件)会更有帮助,因为它至少可以让我缩小问题发生的范围。

[编辑]

该错误似乎是 Acrobat 中一个有趣的错误。

PostScript 程序使用颜色转换函数来反转 RGB JPEG 图像的颜色样本。 (这是一种不受欢迎的做法,它不是传递函数的用途,但并不少见)。 Ghostscript 的 pdfwrite 设备保留了传输功能。

当渲染的 Ghostscript 正确产生预期的结果时,Acrobat 却没有,我不知道他们制造了什么样的混乱导致你得到的结果,但它显然是错误的。

如果我将 Ghostscript 的 pdfwrite 生产设置更改为应用传递函数而不是保留它们:

-c "<</TransferFunctionInfo /Apply>> setdistillerparams" -f PostScript.ps

然后生成的文件可以在 Acrobat 中正确查看。如果我修改 Adob​​e Acorbat 的设置,使其使用 Preserve 而不是 Apply 来传输函数(查看设置 -> 编辑 Adob​​e PDF 设置,然后是颜色选项卡,然后在 'when transfer functions are found',将下拉菜单设置为 Preserve 而不是应用)生成的 PDF 文件在 Ghostscript 中正确呈现,而在 Acrobat 中呈现与 Ghostscript pdfwrite 输出文件相同的错误。

简而言之,恐怕您在这里看到的是一个 Acrobat 渲染错误,您可以通过如上所述更改 Ghostscript 传输函数设置来解决它,但它在 Ghostscript 中确实不是问题。