QImage 加载某些图像的方向错误

Posted

技术标签:

【中文标题】QImage 加载某些图像的方向错误【英文标题】:QImage loads with wrong orientation for certain images 【发布时间】:2013-02-27 22:02:29 【问题描述】:

我正在从如下所示的图像文件中实例化一个 QImage,然后在 QWidget 上渲染它。

QImage ( const QString & fileName, const char * format = 0 )

对于大多数图像,一切正常。但是对于一些图像,QImage 会加载 90 度旋转的图像。

这似乎只发生在我之前在手机上以纵向模式拍摄的照片上。风景拍的都不错

【问题讨论】:

也许图像包含一些有关方向的元数据,您使用的图像查看器会根据该信息旋转图像。 【参考方案1】:

您可能需要使用 libexif 之类的库来确定照片方向,然后相应地旋转 QImage

【讨论】:

你知道哪个libexif API 告诉照片方向吗?更好的是 Qt 中是否有一个内置的库可以完成这项工作? @SaptarshiBiswas 我看了一眼,它看起来不像 Qt 处理 exif。我相信 exif 中的旋转属性称为方向。 libexif 是一个非常简单易用的库,并且具有非常开放的许可证。很容易集成到现有项目中。【参考方案2】:

使用 C++ Qt 类 QImageReader:

QImageReader imgReader( imagePath );
imgReader.setAutoTransform( true );
QImage img = imgReader.read();

【讨论】:

【参考方案3】:

https://discussions.apple.com/thread/2541504?start=0&tstart=0

听起来这是一个很常见的问题,在图像上添加了一些标志或标签,说明如何旋转它,而不是实际重新排序图像中的像素。对于您尝试渲染的图像,您可以使用您尝试使用的格式,看看是否有任何额外的标志可以检查并让 Qt 进行旋转。

听起来 cppguy 知道有一个库可以让您检查这些标志。

EDIT 找到了更好的描述:

johninsj - Re:iPhone 4 照片和视频在电子邮件中横向旋转

2010 年 11 月 2 日下午 1:45(响应 VibrantRedGT)

当您拍摄照片时,Apple 会设置 jpeg 元标记来定位方向, 因此,如果您将 iphone 倒置或侧放等,图像 (这是倒置或侧身拍摄的,因为相机是倒置的 down/sideways) 知道它需要在您查看时翻转/旋转图像 在它。

并非所有软件都支持旋转设置。 Gimp(运行在 一切,而且是免费的)确实如此。

您可以旋转图像并保存它们,或者学习使用 iPhone 以正确的方向显示未旋转的图像。那会 看着屏幕时,主页按钮在右侧。

希望对您有所帮助。

【讨论】:

感谢您的精彩解释。有没有办法在 Qt 中读取 exif 而不是像 cppguy 建议的那样使用外部库? 这两个问题:***.com/questions/15128656/… 和 ***.com/questions/4105534/… 可能会有所帮助。看起来有一些东西,你可以添加:doc.qt.digia.com/qtextended4.4/qexifimageheader.html 由于 QExifImageHeader 不是 Qt 的一部分,我对它的支持和维护方面持怀疑态度 - 所以我按照 cppguy 的建议选择了 libexif。【参考方案4】:

从 Qt 5.5 开始设置 Image.autoTransform : true 因为默认为 false!

QT Image QML Type reference

【讨论】:

谢谢。这帮助我找到了 QImageReader::setAutoTransform()。请参阅我的单独答案。

以上是关于QImage 加载某些图像的方向错误的主要内容,如果未能解决你的问题,请参考以下文章

9.2 使用QImage类加载图片

可以将 QImage 文件内容加载到 QString 吗?

Qt QImage 加载 BMP 图像的一个BUG

Qt QImage 加载 BMP 图像的一个BUG

加载图像 Qsize [关闭]

使用 Qt 从原始数据加载图像