如何在 Qt 中将 tiff 或 pnm 转换为 jpeg

Posted

技术标签:

【中文标题】如何在 Qt 中将 tiff 或 pnm 转换为 jpeg【英文标题】:How to convert tiff or pnm to jpeg in Qt 【发布时间】:2017-12-27 13:36:12 【问题描述】:

我使用扫描仪。扫描仪输出为 tiff 或 pnm 格式。但我无法将这些格式加载到 QImage 中。

QProcess process;
process.start("scanimage -d epjitsu --format=tiff");
process.waitForFinished(240000);
QByteArray ba = process.readAllStandardOutput();
QImage image;
image.fromData(ba);

image.fromData(ba) 会失败,因为 Qt 不知道 tiff 格式。唯一的方法,如何转换它,是将 bytearray 存储到文件并使用 linux 实用程序 convert 来转换它。但我不想走这条路。我想在 Qt 中以某种方式做到这一点。

【问题讨论】:

根据文档支持tiff:doc.qt.io/qt-5/qtimageformats-index.html 这可能是 qt 配置为使用系统 tiff 支持但不存在的情况。这就是我更喜欢捆绑图像格式的自定义 qt 构建的原因,只是为了安全起见。 我已经阅读了很多次 Qt 文档。但我不使用它。如果我想在 CentOS 和 Ubuntu 上使用它,我应该怎么做? 【参考方案1】:

您可以使用GDAL 打开 tiff 文件,然后它们会创建一个 QImage。此 QImage 可以保存为 jpg 格式。

【讨论】:

【参考方案2】:

Qt 通过 libtiff 提供 tiff 支持。

我认为默认配置选项是使用系统提供的任何内容。这意味着您的系统应该安装了 libtiff。

您还可以在提供 -qt-libtiff 配置标志的地方进行自定义 qt 构建,这将使用捆绑的 lib 将其合并到 qt 二进制文件中,而不是使用外部系统库。

另一个需要考虑的是,tiff 支持不在“Qt Essentials”模块中,而是“Qt Add-Ons”的一部分,面对Qt Image Formats 模块。

最后,您仍然可以选择扫描到文件,然后通过外部工具将文件转换为支持的格式。

【讨论】:

我必须使用此选项构建我的项目,还是必须下载 Qt 资源并使用此选项构建它? @PeterPolak 是否为您列出 QImageReader::supportedImageFormats() tiff? 我看到了 tiff。但是,如果我将数据从 QByteArray 加载到 QImage,QImage 对象包含无效图片。 问题不在于将 tiff 格式转换为 QImage,而在于将 QByteArray 数据加载到 QImage 对象中。如果我尝试 QImage::fromFile(tiff 文件),它可以工作。 @PeterPolak API 可能无法仅从日期推断文件格式,在这种情况下,提供特定格式可能会有所帮助。【参考方案3】:

qt 知道 tiff 格式。以下代码对我有用:

QFile f("Untitled.tiff");
if (!f.open(QIODevice::ReadOnly)) 
    return;

QByteArray ar(f.size(), ' ');
f.read(ar.data(), ar.size());
QImage img;

img.loadFromData(ar);
if (!img.isNull())

    QPixmap image = QPixmap::fromImage(img);
    ui.tiffLabel->setFixedSize(img.size());
    ui.tiffLabel->setPixmap(image);

确保满足所有 dll 依赖项(我怀疑是 qtiff.dll)

确保您的 QByteArray ba 包含图片

并且,可能,使用loadFromData insted of fromData 是个好主意

【讨论】:

以上是关于如何在 Qt 中将 tiff 或 pnm 转换为 jpeg的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET 2.0 中将位图转换为一个多页 TIFF 图像

在node.js和GraphicsMagick中将tiff转换为jpeg

在python中将tiff转换为jpeg

在.Net中将TIFF文件转换为PNG

如何在qt中将字符串转换为qwidget

如何在 Qt 中将 QVariant 转换为 QString,反之亦然?