PDF 中的 Qt 图像具有缩放伪像

问题描述

我使用 QPainter::drawImage() 直接使用 QPrinter(设置为 HighResolution)生成一个 PDF 文档,在其中绘制一些像素图像 QImage。

图像尺寸非常小(大约 200x50 像素),并且只有 3 种颜色。我使用更大的 QRect 作为边界框在 PDF 中放大它们。

QImage 本身没有缩放。

我希望 PDF 中的图像清晰明了,但是,它们显示缩放伪像的方式与糟糕的 jpg 相同。 (我想要一种 png 代替...)。

我怎样才能防止这种情况发生?是 QPainter 还是 QPrinter 的问题? 图像压缩问题?还是 PDF 查看器?

QImage* image;

//...

QPrinter printer(QPrinter::HighResolution);
printer.setoutputFileName("/home/xxx/test.pdf");
printer.setoutputFormat(QPrinter::PdfFormat);

QPainter painter;
painter.begin(&printer);

const int SCALING = 30;
QRect imageFrame = image->rect();    // <-- here comes my QImage

imageFrame.setSize( imageFrame.size() * SCALING );
painter.drawImage( imageFrame,*image );

//...

painter.end();

编辑:澄清示例 这是 QImage 在屏幕上的样子:

enter image description here

当我将此图像放入 pdf 时,它看起来像这样,因此具有典型的 jpg 伪像。这张图片的边界框被放大到可以看到内容的细节,但使用的QImage是1:1(即文本像素之一是图像中的一个像素)。

enter image description here

当我在将图像放入 pdf 之前将图像本身放大 4 时(即 QImage 中的每个文本像素为 4x4 像素),它看起来像这样。更接近我想要的,但有放大的图片数据和多个文件大小。

enter image description here

我的问题是如何使用原始(小)QImage,它在 PDF 中以绝对清晰的像素方块显示,而没有这些伪影。

解决方法

我不确定“我想要一种 png”是什么意思。我的理解是,您似乎有 200x50 像素并且想要绘制 6000x1500 像素。这可能是由带有缩放算法的 drawImage() 完成的,这会产生模糊和其他故障。

如果你想要精确的绘图,不管大小,你都需要用 QPainter 来绘制图元。例如,如果我这样写:

QRadialGradient radialGrad(QPointF(100,100),100);
radialGrad.setColorAt(0,Qt::red);
radialGrad.setColorAt(0.5,Qt::blue);
radialGrad.setColorAt(1,Qt::green);

painter.setBrush(QBrush(radialGrad));
painter.drawEllipse(160,100,50,50);
painter.drawRect(100,50);

这是我得到的:

enter image description here

请注意,我放大得太厉害了,您甚至看不到预览中的形状。渐变还是很完美的。

我不是 PDF 专家,但 QPainter 可能对图像使用光栅,对图元使用矢量:https://en.wikipedia.org/wiki/PDF#Imaging_model