Qt下如何通过Qimage加载图片并利用OpenglWidget控件成像

使用opengl进行图像显示和处理具有很好性能表现,并且支持开发丰富的拓展功能。但是在qt下如何通过加载图片并显示,网上提供的方法过于复杂。笔者经过实践,总结出如下经验,并附录代码以供参考。
步骤:
1. 通过QImage读取图片;
2. 接下来就是要将QImage的数据转换成opengl所需的数据。通过QGLWidget::convertToGLFormat来实现。
代码注释里有一些注意事项,请大家也要注意。如果有更好的实现方式,也请多多指教。

  QImage srcImg(filePath);//从路径读取图片
    QImage imgAfterProcess;
    int imgFormat = srcImg.format();//获取图片的format类型,防止加载qt无法识别的图片导致QGLWidget::convertToGLFormat崩溃报错
    if (imgFormat==0)
    {
        return;
    }
    else
    {
        imgAfterProcess =  srcImg.convertToFormat(QImage::Format_RGB32);//有效图片先统一格式,防止QGLWidget::convertToGLFormat可能出现问题
    }
    imgAfterProcess =  QGLWidget::convertToGLFormat(imgAfterProcess);
    imgAfterProcess =  imgAfterProcess.mirrored(false, true);//这里必须要垂直翻转,否则所成像是倒立的
    m_pImageDisplayModel->m_ImageToDisplay =  imgAfterProcess;
    m_pImageDisplayModel->m_GlPixelData =  m_pImageDisplayModel->m_ImageToDisplay.bits();//将数据指针传递给GLubyte*型指针
    m_pImageDisplayModel->m_imageWidth =  m_pImageDisplayModel->m_ImageToDisplay.width();
    m_pImageDisplayModel->m_imageHeight =  m_pImageDisplayModel->m_ImageToDisplay.height();
    m_pView->ui.openGLWidgetForMainView->DisplayImageInGL();//进行update,更新控件图像

这里为给OpenGLwidget加入更多的功能,继承OpenGLwidget并重写了一些函数,实际调用数据的是

glDrawPixels(m_pImageDisplayModel->m_imageWidth, m_pImageDisplayModel->m_imageHeight,  GL_RGBA, GL_UNSIGNED_BYTE,  m_pImageDisplayModel->m_GlPixelData);

你可能感兴趣的:(C++,图像显示,opengl,qt,c++,opengl,经验分享)