当前位置: 代码迷 >> QT开发 >> linux Qt 用QImage或者QPix地图加载bmp图像时一直返回false
  详细解决方案

linux Qt 用QImage或者QPix地图加载bmp图像时一直返回false

热度:274   发布时间:2016-04-25 03:01:58.0
linux Qt 用QImage或者QPixmap加载bmp图像时一直返回false
本帖最后由 lixiaoli20072765 于 2015-01-26 18:28:27 编辑
QImage* img=new QImage;
     // img->load("./test.bmp");
      if(! ( img->load("/mntTest/test.bmp",0) ) ) //加载图像
     {
         qDebug("-------------------fail-------------------");
     }

在Linux系统中, Qt程序使用QImage或者QPixmap加载bmp格式图像一直失败,
报错为:
QImage:scaled: Image is a null image,查资料说这样报错可能是路径有问题,但是相同路径下png
格式的图像加载就是成功的,由于加载图像失败也无法把bmp格式转换为png格式的图像,请各位帮忙看看什么原因,在线等!!!
------解决思路----------------------
bmp是windows bitmap
可能就是不支持的。

你是调试的时候就不能加载应该不是库的问题。

打开你的Assistant 查到Qimage 看看说明里支不支持BMP的读写
我现在是windows的懒得切换了

如果不支持,找个开源库把bmp转换为png还是很容易的。
你要感兴趣,自己看下两种的格式,自己就能写代码来转换

------解决思路----------------------
我以前也遇到过类似问题,bmp格式的位图似乎不止一种存储格式(这方面我没去深入研究了)。
linux Qt似乎打开bmp位图时有更严格的限制,用二进制编辑器打开bmp位图,Qt只能打开第0、1字节为0x42、0x4d的位图。
windows的画图软件保存的文件头是以这两字节开头,但linux下的软件保存的却不一定。
------解决思路----------------------
按你上面的代码有输出-------------------fail---------------------------吗?
------解决思路----------------------
建议你换一张BMP图片试试看,有可能是你的图片有问题
------解决思路----------------------
下面是我以前在ubuntu和ARM上测试bmp位图的部分代码,打开和缩放都没有问题,供参考。
void Dialog::on_fileBtn_clicked()
{
    QString filename = QFileDialog::getOpenFileName(this, "Open Bitmap", "./", "*.bmp");
    if(filename.isEmpty())
        return;
//            QImage *image = new QImage(filename, "BMP");
//            if(image != NULL)
    QImage *image = new QImage();
    if(image == NULL)
    {
        qDebug("image is NULL");
        return;
    }
    if(!image->load(filename))
    {
        qDebug() << "load image : " << filename << "      fail";
        delete image;
        return;
    }

    ui->bmpLabel->setPixmap(QPixmap::fromImage(image->scaled(100,100)));

    if(image->format() == QImage::Format_Mono)
    {
        qDebug() << "format_mono";
    }
    else if(image->format() == QImage::Format_MonoLSB)
        qDebug() << "format_monoLSB";
    else if(image->format() == QImage::Format_Indexed8)
        qDebug() << "QImage::Format_Indexed8";
    else if(image->format() == QImage::Format_RGB32)
        qDebug() << "QImage::Format_RGB32";
    else if(image->format() == QImage::Format_ARGB32)
        qDebug("QImage::Format_ARGB32");
    else if(image->format() ==QImage::Format_ARGB32_Premultiplied)
        qDebug("QImage::Format_ARGB32_Premultiplied");
    else if(image->format() == QImage::Format_RGB16)
        qDebug("QImage::Format_RGB16");
    else if(image->format() == QImage::Format_ARGB8565_Premultiplied)
        qDebug("QImage::Format_ARGB8565_Premultiplied");
    else if(image->format() == QImage::Format_RGB666)
        qDebug("QImage::Format_RGB666");
    else if(image->format() == QImage::Format_ARGB6666_Premultiplied)
        qDebug("QImage::Format_ARGB6666_Premultiplied");
    else if(image->format() == QImage::Format_RGB555)
        qDebug("QImage::Format_RGB555");
    else if(image->format() == QImage::Format_ARGB8555_Premultiplied)
        qDebug("QImage::Format_ARGB8555_Premultiplied");
    else if(image->format() == QImage::Format_RGB888)
        qDebug("QImage::Format_RGB888");
    else if(image->format() == QImage::Format_RGB444)
        qDebug("QImage::Format_RGB444");
    else if(image->format() == QImage::Format_ARGB4444_Premultiplied)
        qDebug("QImage::Format_ARGB4444_Premultiplied");
    else qDebug("unkown format");

    delete image;
}
------解决思路----------------------
引用:
@u011330815 
一开始也以为是图像问题,已经换了好多图像了,凡是bmp的都是失败

我之前显示bmp图片是这样做的:
QPixmap *background = new QPixmap();
background->load("E:/image/1.bmp");
*background = background->scaled(background->width(),background->height(),Qt::KeepAspectRatio);//裁剪图片及显示方式
QLabel *label = new QLabel(this);
label->setPixmap(*background);
我这样是可以显示的,你看看行不行
------解决思路----------------------
很奇怪的现象。bmp是Qt原生支持的图片类型,在不同平台下,Qt内部用的是完全一样的代码。

如果你确定你使用的是绝对路径,而且确定同一张图片,在其他平台下可以打开,但是在你的平台下无法打开,那么这应该就是 QBmpHandler 的一个BUG,你也可以调试程序看看,问题出在 QBmpHandler哪儿
------解决思路----------------------
引用:
我这边显示的还是不行哦,显示说是空图像

你看看路径对不对,也有可能是linux下不支持BMP,我也没有试过,能肯定的是windows下是可以的。
  相关解决方案