❝来自于Qt技术交流群群友提出的问题,QImage读取不同的png图像,有些可以读取到有些读取不了,究竟是什么回事呢?❞
1.png
和2.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)
可能是图片格式不对,于是使用二进制软件分别打开两个图片查看究竟是什么情况。
1.png
图片内容:
2.png
图片内容:
通过查找资料可以看到png
格式文件有固定头,解析出来的能看到有png
字符串:
89 50 4E 47 0D 0A 1A 0A
通过查看1.png
格式的文件头内容是png
格式文件的固定头内容,所以推断1.png
是png
格式文件。 通过查看jpeg
格式头内容和比对2.png的格式头内容可以断定2.png
是jpeg
格式的文件。
一般jpeg
格式头内容为:(注:图片存储格式之一,由JPEG格式衍生而来,后缀为".jfif"。)
FF D8 FF E0 00 10 4A 46 49 46 00
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)
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"
jpeg
格式的内容却是png
的后缀呢?」
Qt君认为可能有保存图片的时候强制保存为带有png
后缀的图片。hexdump
。