【问题标题】:Qt Images in PDF have scaling artifactsPDF 中的 Qt 图像具有缩放伪影
【发布时间】:2021-06-11 06:07:11
【问题描述】:

我直接使用 QPrinter(设置为 HighResolution)生成 PDF 文档,在其中我使用 QPainter::drawImage() 绘制几个像素图像 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 在屏幕上的样子:

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

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

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

【问题讨论】:

    标签: c++ image qt pdf image-compression


    【解决方案1】:

    我不确定您所说的“我想要一种 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, 100, 50, 50);
    

    这是我得到的:

    请注意,我放大了很多,您甚至无法在预览中看到形状。渐变还是很完美的。

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

    【讨论】:

    • 感谢您的回答。请参阅我上面的编辑以进行澄清。我的观点不是要有平滑的渐变,而是相反的清晰像素。
    • 这个圆圈对我来说似乎很清晰。还是没看懂问题,不好意思。您似乎有一个大小为 (a, b) 的 QImage,并希望以相同的质量以 (a*30, b*30) 大小绘制它。
    • 另外,您可能应该使用 QPrinter::ScreenResolution 进行测试。另一个可能值可能会在内部扩展。
    • 我没有矢量图像,也没有绘制到 PDF - 我插入了位图。我的项目是一个 LCD 模拟器,所以我使用 QImage 来保存 240x64 像素、蓝底白字的显示器内容。请参阅第一个示例,其中显示“T1 测试 - 请稍候”。现在我想在 PDF 中记录这些屏幕,其中每个“屏幕截图”大约是半个 A4 页面宽。白色像素是干净的白色方块,而蓝色像素是蓝色的,这一点非常重要。但是,由于原始位图非常小,PDF 内部可能使用 jpg,这会在放大时导致图像模糊(示例 2)。
    • 是的,如前所述,PDF 可能包含光栅内容,可能是 jpg:en.wikipedia.org/wiki/PDF#Imaging_model。在这两种情况下,按比例放大都会降低质量,但对于嵌入的编码内容来说甚至更糟。不知道你是否可以在 Qt 中选择嵌入图像的编码,对不起。
    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多