在将大型QImage绘制到QWidget

时间:2016-07-01 15:30:10

标签: c++ qt camera qpainter qimage

我正在开发一个应用程序,它可以显示来自18百万像素IDS uEye相机的实时信号。

我显示图像的三个选项是 1)使用API​​中的Direct3D方法使用(HWND)QWidget-> winId()绘制到QWidget。 2)使用API​​中的位图渲染方法使用(HWND)QWidget-> winId()绘制到QWidget。 3)从原始传感器数据(char *缓冲区)创建QImage并使用QImage更新GUI。

因为我想在我的应用程序中使用QImage类的功能,所以我目前正在寻找最后一个选项。

我可以使用以下代码成功转换来自相机的图像:

// Collect the image.
int nRet = is_GetImageMem(m_hCam, &m_pcLongImageMemory);
if( nRet != IS_SUCCESS)
{
    // handle error
}

//Put in unique_ptr<> to QImage
img.reset((new QImage((uchar*)m_pcImageMemory, m_nSizeX, m_nSizeY, QImage::Format::Format_RGB888)));
ui.widget->setImage(img.get());

这在生成我将使用的图像方面做得很好。然后我想将图像绘制到QWidget。为此,根据this线程的建议,我已经能够成功获取这些大型的18 MP图像并使用它们更新GUI。

所以,我的问题出现在以下方法中:

void ImageFrame::paintEvent(QPaintEvent*) {
  if (!m_image) { return; }

  QPainter painter(this);
  painter.drawImage(this->rect(), *m_image, m_image->rect());
}   

我的问题在于使用的QPainter :: paintImage()方法所做的调整。似乎:: paintImage()的大多数重载都会自动拉伸图像以适应边界矩形。在我的情况下,我宁愿始终保持我的图像的4:3宽高比,以避免用户的任何失真。在这种情况下,我没有找到QRect()配置,这将允许我使用此图像更新GUI而不进行拉伸。

似乎我的选择是将图像重新缩放到GUI中的窗口小部件的大小(对于这样大小的图像看起来非常非常昂贵),或者找到一种方法来修复此QWidget子类的大小所以它总是可以扩展到最大的4:3比例配置,它可以在其周围的布局......

有人可能提供的任何帮助或见解表示赞赏。

0 个答案:

没有答案