我正在开发一个应用程序,它可以显示来自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比例配置,它可以在其周围的布局......
有人可能提供的任何帮助或见解表示赞赏。