有时候我们发觉,Qt无法正确的展示某些图片,用windows自带的图片工具或者其他工具都能展示出来。
这是为什么呢?
Qt中处理图像类的常用类为QImage、QPixmap、QBitmap。这几个类是通过文件的后缀名来认定文件的类型,从而进行解析调用相对应类型模块来显示图片,qt这么做或许是为了加载速度!而不用每次去判断文件类型再来选择用什么模块来加载或者显示。
但是这对开发者来说,确是一个坑!往往有些图片是用户直接改后缀名的,比如将 jpeg 格式的图片直接改为 png,那么qt以 png 的模块去加载就无法解析了。
所以,若是要精准判断图片或者类型,最好自己先判断一下文件的magic number!相当于文件头前面一串唯一的数字,这个可以真实的反应图片或者文件的类型。
- 获取文件的magic number
QFile file("file.xxx"); file.open(QIODevice::ReadOnly); QDataStream in(&file); // Read and check the header quint32 magic; in >> magic; if (magic != 0x89504e47) { //文件类型为 png }
- 常见图片的 magic number
类型 | magic number(0x) | 描述 |
---|---|---|
.jpg | ffd8ff | JPEG (jpg) |
.jpeg | ffd8ff | JPEG (jpg) |
.jpe | ffd8ff | JPEG (jpg) |
.png | 89504e47 | PNG (png) |
.gif | 47494638 | GIF (gif) |
.tif | 49492a00 | TIFF (tif) |
.bmp | 424d | 16ɫλͼ(bmp) |
.bmp16 | 424d228c010000000000 | 16ɫλͼ(bmp) |
.bmp24 | 424d8240090000000000 | 24λλͼ(bmp) |
.bmp256 | 424d8e1b030000000000 | 256ɫλͼ(bmp) |
- 指定图片类型加载
QIcon icon; QPixmap pixm = QPixmap("filePath","PNG"); if (!pixm.isNull()) icon.addPixmap(pixm, QIcon::Normal, QIcon::Off); pPushBtn->setIcon(icon);
假设某个控件加载的图片类型是指定的3种:png、jpg和gif。那么直接判断获取到 pixmap 是否为空来决定是否用用另一种格式来解析。
QIcon icon; QPixmap pixm = QPixmap(sData.strIcon,"PNG"); if (pixm.isNull()){ pixm = QPixmap(sData.strIcon,"JPG"); if (pixm.isNull()){ pixm = QPixmap(sData.strIcon,"GIF"); if (pixm.isNull()){ icon.addFile(QString(":/tool/tool_default"), QSize(), QIcon::Normal, QIcon::Off);//加载默认图标 } } } if (!pixm.isNull()) icon.addPixmap(pixm, QIcon::Normal, QIcon::Off); pPushBtn->setIcon(icon);
文章来源: QT 无法正确展示或者识别图片或文件