如何使用 Qt4 打印为 PNG 格式

Posted

技术标签:

【中文标题】如何使用 Qt4 打印为 PNG 格式【英文标题】:How to print to PNG format with Qt4 【发布时间】:2016-07-19 08:59:01 【问题描述】:

我正在努力使用 Qt4 将图像打印为 PNG 格式。 以下代码默认设置为 PDF 或 PS,但无法选择 PNG:

void DetectorView::printToFile()


// A basic printing function
QPrinter printer;
QPrintDialog dialog(&printer, this);
if (dialog.exec()==QDialog::Accepted) 
    QPainter painter(&printer);
    this->render(&painter);
    std::cout << "INFO [DetectorView::printToFile] Wrote file " << std::endl;

else 
    std::cout << "INFO [DetectorView::printToFile] Cancelling printer " << std::endl;


任何帮助将不胜感激!

【问题讨论】:

这真的需要使用QPrintDialog吗?为什么不直接渲染到QImage,然后使用QImage::save 【参考方案1】:

使用此链接:Rendering QWidget to QImage loses alpha-channel,您可以将您的小部件呈现为QImage。

然后,使用QImageWriter,您可以将其保存为 png:

// render QWidget to QImage:
QImage bitmap(this->size(), QImage::Format_ARGB32);
bitmap.fill(Qt::transparent);
QPainter painter(&bitmap);
this->render(&painter, QPoint(), QRegion(), QWidget::DrawChildren);

// save QImage to png file:
QImageWriter writer("file.png", "png");
writer.write(bitmap);

注意:提供的链接适用于 Qt5,但这应该适用于 Qt4。

【讨论】:

这确实有效,但不是我想要的行为。需要有一个交互式 GUI,您可以在其中更改文件名和位置。还是,谢谢!它帮助我得到了我将在下面发布的解决方案 这确实是一个细节,正如你所建议的,只需使用QFileDialog::getSaveFileName 来获取文件名。【参考方案2】:

使用 jpo38 的答案,我扩展以获得我想要的行为:

void DetectorView::printToFile()

    QString default_name = "myImage.png";
    QImage bitmap(this->size(), QImage::Format_ARGB32);
    QPainter painter(&bitmap);
    this->render(&painter,QPoint(),QRegion(),QWidget::DrawChildren);
    QString filename = QFileDialog::getSaveFileName(this, tr("Save File"),QDir::homePath()+"/"+default_name,tr("Image Files (*.png *.jpg *.bmp)"));
    QImageWriter writer(filename, "png");
    writer.write(bitmap);
    std::cout << "INFO [DetectorView::printToFile] Wrote image to file" << std::endl;

注意创建交互式窗口所需的 QFileDialog。

【讨论】:

以上是关于如何使用 Qt4 打印为 PNG 格式的主要内容,如果未能解决你的问题,请参考以下文章

如何将画布部分从 Ghostscript 打印结果裁剪为 PNG

Navicat如何导出数据库的svgpdf,png图片

如何将 .png 文件转换为 .bmp?

Qt4:将 SQL 表打印为 PDF

c# 打印里图片这么让png的高清大图按比例缩小,

使用 c# 将 png 文件转换为 pcx 文件