欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-25 20:53:46
...
问题描述

有时候我们发觉,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 图片不显示