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

问题描述

有时候我们发觉,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)描述
.jpgffd8ffJPEG (jpg)
.jpegffd8ffJPEG (jpg)
.jpeffd8ffJPEG (jpg)
.png89504e47PNG (png)
.gif47494638GIF (gif)
.tif49492a00TIFF (tif)
.bmp424d16色位图(bmp)
.bmp16424d228c01000000000016色位图(bmp)
.bmp24424d824009000000000024位位图(bmp)
.bmp256424d8e1b030000000000256色位图(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);
  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值