找回密码
 立即注册
收起左侧

显示内存BMP图片和实际是反的,新人求助!

5
回复
3567
查看
[复制链接]
累计签到:3 天
连续签到:1 天
来源: 2020-2-18 10:06:55 显示全部楼层 |阅读模式
1Qter豆
QImage加载内存中的BMP位图数据,显示的图片和原始图片不一致,是相反的,以下是代码,求各位大神指点
void MainWindow::ReadShowBMP(QString strFile)
{
    QFile file(strFile);
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug()<<"open file failed"<<endl;
    }
    QDataStream streamIn(&file);
    streamIn.setByteOrder(QDataStream::LittleEndian);
    BITMAPFILEHEADER imageSrc;
    initStruct((char*)&imageSrc, sizeof(BITMAPFILEHEADER));
    streamIn >> imageSrc.bfType;
    streamIn >> imageSrc.bfSize;
    streamIn >> imageSrc.bfReserved1;
    streamIn >> imageSrc.bfReserved2;
    streamIn >> imageSrc.bfOffBits;
    BITMAPINFOHEADER infoSrc;
    initStruct((char*)&infoSrc, sizeof(BITMAPINFOHEADER));
    streamIn >> infoSrc.biSize;
    streamIn >> infoSrc.biWidth;
    streamIn >> infoSrc.biHeight;
    streamIn >> infoSrc.biPlanes;
    streamIn >> infoSrc.biBitCount;
    streamIn >> infoSrc.biCompression;
    streamIn >> infoSrc.biSizeImage;
    streamIn >> infoSrc.biXPelsPerMeter;
    streamIn >> infoSrc.biYPelsPerMeter;
    streamIn >> infoSrc.biClrUsed;
    streamIn >> infoSrc.biClrImportant;
                RGBQUAD *pColorTable;
                 BYTE format = WORDtoQuint16(infoSrc.biBitCount);
    if (format == 1) //对于黑白图
    {
      pColorTable = new RGBQUAD[2];
      //读入颜色表
      for (int i = 0; i < 2; i++)
      {
          streamIn >> pColorTable[i].rgbBlue;
          streamIn >> pColorTable[i].rgbGreen;
          streamIn >> pColorTable[i].rgbRed;
          streamIn >> pColorTable[i].rgbReserved;
      }
    }
    if (format == 8) //对于灰度图,共有256种颜色
    {
      pColorTable = new RGBQUAD[256];
      //读入颜色表
      for (int i = 0; i < 256; i++)
      {
          streamIn >> pColorTable[i].rgbBlue;
          streamIn >> pColorTable[i].rgbGreen;
          streamIn >> pColorTable[i].rgbRed;
          streamIn >> pColorTable[i].rgbReserved;
      }
    }
                 quint32 length;
    length = DWORDtoQuint32(imageSrc.bfSize) - DWORDtoQuint32(imageSrc.bfOffBits);
    BYTE * bmpData = new BYTE[length];
    for (quint32 i = 0; i < length; i++)
    {
      streamIn >> bmpData[i];
    }        
   QImage image(bmpData,57,68,QImage::Format_RGB888);
    QMatrix matrix;
    matrix.rotate(180);
    QImage imgRatate = image.transformed(matrix).rgbSwapped();
    QPixmap pixmap = QPixmap::fromImage(imgRatate);
    ui->label->setPixmap(pixmap);
    file.close();
下图是显示对比,左边是通过paintEvent显示的原始图片,右边是QImage显示的图片


附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
2020-2-18 11:38:27 显示全部楼层
开始时上下颠倒,使用rotate反转180后,又变成左右反了
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
2020-2-18 13:47:11 显示全部楼层
太笨了,直接镜像函数就解决了
QImage image(bmpData,57,68,QImage::Format_RGB888);
QPixmap pixmap = QPixmap::fromImage(image.mirrored()); //镜像函数
ui->label->setPixmap(pixmap);

点评

ok  发表于 2020-2-18 13:48
回复

使用道具 举报

累计签到:161 天
连续签到:1 天
2020-2-19 09:20:00 显示全部楼层
本帖最后由 学到老 于 2020-2-19 09:29 编辑


上面代码是对image进行了水平旋转变换,修改成如上楼的镜像变换即可。
问题是原始图像不要变换直接用来显示不行么,怎么会是反的呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
2020-2-20 08:47:34 显示全部楼层
学到老 发表于 2020-2-19 09:20
上面代码是对image进行了水平旋转变换,修改成如上楼的镜像变换即可。
问题是原始图像不要变换直接用来显 ...

BMP图片数据读取是从下到上从左到右的,直接显示的结果就是上下左右是相反的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了