首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qt读取图片之小坑

Qt读取图片之小坑

作者头像
Qt君
发布2020-03-19 17:32:58
5.7K2
发布2020-03-19 17:32:58
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

❝来自于Qt技术交流群群友提出的问题,QImage读取不同的png图像,有些可以读取到有些读取不了,究竟是什么回事呢?❞

0x01 问题重现

  • 有图片1.png2.png
  • 1.png使用QImage读取成功,而2.png则不能正确读取图片。
qDebug() << "1.png: " << QImage("1.png");
qDebug() << "2.png: " << QImage("2.png");

分别输出:

1.png:  QImage(QSize(1222, 900),format=QImage::Format_ARGB32,depth=32,devicePixelRatio=1,bytesPerLine=4888,sizeInBytes=4399200)
2.png:  QImage(null)

0x02 问题分析

  可能是图片格式不对,于是使用二进制软件分别打开两个图片查看究竟是什么情况。 1.png图片内容:

2.png图片内容:

  通过查找资料可以看到png格式文件有固定头,解析出来的能看到有png字符串:

89 50 4E 47 0D 0A 1A 0A

  通过查看1.png格式的文件头内容是png格式文件的固定头内容,所以推断1.pngpng格式文件。  通过查看jpeg格式头内容和比对2.png的格式头内容可以断定2.pngjpeg格式的文件。   一般jpeg格式头内容为:(注:图片存储格式之一,由JPEG格式衍生而来,后缀为".jfif"。)

FF D8 FF E0 00 10 4A 46 49 46 00

0x03 问题解决

  • 方法1:使用图像软件转换为正确的图像,但该方法较为繁琐。
  • 方法2:使用QImage::fromData正确读取。如:
QFile file("2.png"); // 实际为jpeg格式
file.open(QIODevice::ReadOnly);
QByteArray data = file.readAll();
qDebug() << QImage::fromData(data);

输出:QImage(QSize(1048, 1234),format=QImage::Format_RGB32,depth=32,devicePixelRatio=1,bytesPerLine=4192,sizeInBytes=5172928)
  • 方法3:可以去除文件后缀然后再使用QImage读取。如:
qDebug() << QImage("2");
输出:
QImage(QSize(1048, 1234),format=QImage::Format_RGB32,depth=32,devicePixelRatio=1,bytesPerLine=4192,sizeInBytes=5172928)

或:

QImageReader reader("2");
qDebug() << reader.imageFormat() << reader.format();
输出:
QImage::Format_RGB32 "jpeg"

0x04 一些疑问解答

  1. 「究竟为什么会是jpeg格式的内容却是png的后缀呢?」 Qt君认为可能有保存图片的时候强制保存为带有png后缀的图片。
  2. 「为什么看图软件都能打开,而QImage却不能正确读取呢?」因为大多数看图软件都是通过读文件头信息去判断图片的格式,而「QImage是通过文件后缀去获取图片格式」,这就会有导致图片格式误判的问题。猜测可能是Qt出于性能考虑的原因吧。
  1. 「关于方法3为什么去除后缀后可以正确读取的问题?」 因为QImageReader内部会先判断文件是否有后缀,「如果有后缀」:就认为是改后缀图片再去验证图片是否有效,「如果没有后缀」,则会读取文件内容再去判断图片格式和验证图片是否有效的操作。

0x05 关于更多

  • 查看图片源内容软件:VScode的插件hexdump
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 问题重现
  • 0x02 问题分析
  • 0x03 问题解决
  • 0x04 一些疑问解答
  • 0x05 关于更多
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档