QPixmap,QImage load图片失败问题

 

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());
    }

 

图片格式

 

  • 22
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值