Qt封装了很多关于图片加载的类,主要有QPixmap,QImage,QPicture,QBitmap四种。QImage一般用于数据流IO操作,运用此类可以直接获取像素详细信息;QPixmap:一般用于界面上图片展示;QBitmap是对QPixmap的进一步封装,显示单色图片,一般在做不规则窗口时可能用到;QPicture是一个可以记录和重现QPainter命令的绘图设备。
这次主要是记录我在使用QPixmap和QImage处理图片时遇到的问题和解决方案。
现象描述:
一个长时间使用的图片展示工具突然有那么几张图片一直无法展示,代码加载方式为:
QPixmap pix;
QImage img;
bool ret = pix.load(str); //false
bool ret = img.load(str); //false
问题查找:
1.因为加载失败的几张图片均是"*.PNG"格式,猜测Qt图片解析库损坏或被误删(imageformats文件夹内存放Qt所有图片解析库,应放在与应用程序同级目录)发现文件没有发生任何变化,且后续发现部分png图片可以正常加载,排除这个问题;
图 imageformats图片解析库
2.既然库没有损坏,想也知道Qt不会有这种低级bug存在,所以肯定是我的问题。那么排除库和代码使用错误最可能的情况就是图片损坏了,于是我把图片转成二进制数据看了下格式
图 加载失败图片数据查看
哦豁,破案了!!!图片名称为xxx.png单其内部实际存储的图片格式为JPG,Qt提供的图片加载函数如下:
bool load(const QString& fileName, const char *format = Q_NULLPTR, Qt::ImageConversionFlags flags = Qt::AutoColor);
fileName为图片文件的存储位置,也可以时本地记载的qrc资源路径;format 指定加载图片的格式,此项为空时默认根据fileName后缀名解析图片;如图片load(“a.jpg”),默认以JPEG格式解析数据,如果a.jpg实际存储为png、bmp等不为jpg的格式,此时将会出现load失败的情况,这种情况也就是本人碰见的情况。
解决方案
知道原因后解决方法就比较简单了,QPixmap和QImage 都提供了另一个图片加载函数:
此函数当默认format为空时仍然是先以文件后缀名进行尝试解析,如果解析失败,则根据数据流的头信息再次重载图片信息。此方法可以解决就我目前的所有图片加载需求。
代码展示:
QPixmap pix;
if(!pix.load(imgpath))
{
QFile file(imgpath);
if(!file.open(QIODevice::ReadOnly))
{
QMessageBox::warning(this,QString("提示"),QString("打开图片文件失败!%1").arg(imgpath));
return;
}
pix.loadFromData(file.readAll());
}
图片格式