QT 无法正确展示或者识别图片或文件

匿名 (未验证) 提交于 2019-12-03 00:32:02

有时候我们发觉,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);
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!