我正在尝试将QImage中的图像类型作为QString,这是我使用的代码:
QImageReader reader(filename);
QByteArray filetype_ba = reader.format();
QString filetype_qs(filetype_ba);
有用。但是当我重命名文件时,例如从image.png重命名为image.jpg,它返回空值。这是否意味着QImageReader从文件名读取而不是文件头?我想从头部获取图像类型,所以即使我重命名文件(不转换),它仍然会给我正确的类型。
QImageReader documentation specify the following steps:
- 首先根据可选格式字符串或文件名后缀查询图像插件
- 如果没有插件支持图像格式,则会根据可选格式字符串或文件名后缀检查Qt的内置处理程序。
- 如果找不到有能力的插件或内置处理程序,则通过检查数据流的内容来测试每个插件。
- 如果没有插件可以根据数据内容检测图像格式,则通过检查内容来测试每个内置图像处理程序。
- 最后,如果以上所有方法都失败,QImageReader将在尝试读取图像时报告失败。
似乎一个处理程序匹配文件扩展名,并且如你所假设的那样在不检查内容的情况下说“嘿,我完全可以读取”。通过(好)设计,jpeg处理程序应该只处理jpeg而不是其他任何东西。
事情是QImage表现不同,因为它直接查看文件数据流以猜测格式。看起来你应该仅依靠Qimage
机制进行检测。
注意:这描述了默认行为,它与QImageReader::setAutoDetectImageFormat(true)
相同。 false表示程序员应该使用第二个参数或其他方法自己设置图像类型。
QMimeDatabase :: MatchContent
文件内容优先用于查找匹配而不是文件后缀。
QMimeType type = QMimeDatabase().mimeTypeForFile(fileName, QMimeDatabase::MatchContent);
QImage image("fileName", const_cast<char *>(type.preferredSuffix().toStdString().c_str()));