【问题标题】:get image type from qimage从 qimage 获取图像类型
【发布时间】:2019-04-19 02:14:41
【问题描述】:

我正在尝试从 QImage 获取图像类型为 QString,这是我使用的代码:

QImageReader reader(filename);
QByteArray filetype_ba = reader.format();
QString filetype_qs(filetype_ba);

它有效。但是当我重命名文件时,例如从 image.png 到 image.jpg,它返回空值。这是否意味着 QImageReader 从文件名而不是文件头读取?我想从标题中获取图像类型,所以即使我重命名文件(不转换),它仍然会给我正确的类型。

【问题讨论】:

  • 您只是重命名文件还是将其从 png 转换为 jpg?
  • QImage *image = new QImage(filename); 这一行的意义何在?
  • 它是我的属性浏览器的一部分,我可以在其中使用 QFileDialog 选择图像文件。属性浏览器应显示文件名和图像文件的预览,以及子属性中的宽度/高度/图像类型。这里可以忽略。 (现在在问题中删除)

标签: qt qimage


【解决方案1】:

QImageReader documentation specify the following steps:

  1. 首先根据可选格式字符串或文件名后缀查询图像插件
  2. 如果没有插件支持图像格式,则检查 Qt 的内置处理程序基于可选格式字符串或文件名 后缀。
  3. 如果未找到功能强大的插件或内置处理程序,则会通过检查数据流的内容来测试每个插件。
  4. 如果没有插件可以根据数据内容检测图像格式, 通过检查内容来测试每个内置图像处理程序。
  5. 最后,如果以上所有方法都失败,QImageReader 会报告 尝试读取图像时失败。

似乎处理程序匹配文件扩展名,并说“嘿,我完全可以阅读”而不检查内容,正如您假设的那样。通过(好的)设计,jpeg 处理程序应该只处理 jpeg 而不是其他的。

问题是 QImage 的行为不同,因为它直接查看文件数据流来猜测格式。看来您应该仅基于Qimage 机制进行检测。

注意: 这描述了默认行为,与QImageReader::setAutoDetectImageFormat(true) 相同。 false 意味着您,程序员,应该使用第二个参数或其他方法自己设置图像类型。

【讨论】:

  • 这就是我首先尝试的。我查看了 Qt 中的 QImage-Class 文档,但找不到任何方法可以直接从 QImage 获取图像类型(或者我只是瞎了......)
  • 找到了一些东西,但我不知道为什么它(不)工作。首先我找到QImageReader::setAutoDetectImageFormat(bool enabled) 并将其设置为false,但现在我根本没有从reader.format() 得到任何东西,甚至没有我没有重命名的原始文件。然后我将QImageReader::setDecideFormatFromContent(bool ignored) 设置为忽略,这也会禁用自动检测图像格式。有了这个,我总能得到正确的图像类型,但我不能再用QSize size = image->size(); size.height(); size.width(); 得到高度和宽度......为什么???
【解决方案2】:

QMimeDatabase::MatchContent

文件内容优先用于查找匹配而不是文件后缀。

QMimeType type = QMimeDatabase().mimeTypeForFile(fileName, QMimeDatabase::MatchContent);
QImage image("fileName", const_cast<char *>(type.preferredSuffix().toStdString().c_str()));

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 2013-10-04
    • 2013-03-22
    • 2021-10-24
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多