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);
推荐阅读