Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt:优化绘制事件_C++_Qt - Fatal编程技术网

C++ Qt:优化绘制事件

C++ Qt:优化绘制事件,c++,qt,C++,Qt,我目前正在从解码器中读取图像,并在小部件中绘制图像的每一帧。 这就是我现在正在做的: paintEvent(...){ ... painter.setRenderHint(QPainter::Antialiasing, false); painter.setRenderHint(QPainter::HighQualityAntialiasing, false); QPixmap pmap = QPixmap::fromImage(glImage).scaled

我目前正在从解码器中读取图像,并在小部件中绘制图像的每一帧。 这就是我现在正在做的:

 paintEvent(...){ 
    ...
    painter.setRenderHint(QPainter::Antialiasing, false);
    painter.setRenderHint(QPainter::HighQualityAntialiasing, false);
    QPixmap pmap = QPixmap::fromImage(glImage).scaledToWidth(width());
    painter.drawPixmap(0, (height() - pmap.height()) / 2, pmap);
    ... 
  }
然而,我发现它在计算上很昂贵。。。
如果不在Qt中使用OpenGL,有什么解决方案吗?

您可以尝试使用QPaint::drawImage,而不是在图像表示之间进行手动转换(QImage->QPixmap)。参考文档,它仍应提供缩放图像的方法-“注意:如果图像和矩形大小不一致,则图像将缩放为适合矩形。”。

首先,在绘制前无需缩放您的pixmap。您可以将所需的宽度和高度作为参数传递给
painter.drawPixmap
。这将在绘制时缩放图像,速度(可能)更快

然后,您可以尝试直接绘制图像。根据您使用的操作系统,这可能会更慢或更快

例如,在Windows上,
QPixmap
在内部由
QImage
表示。因此,
QPixmap::fromImage
将基本上创建该图像的(可能不必要的)副本

int w = width();
int h = w * glImage.height() / (double)glImage.width();
painter.drawImage(0, (height() - h) / 2, w, h, glImage);
如果直接绘制图像,alpha混合可能会变得非常昂贵。因此,如果可能,请使用不带alpha通道或预乘alpha的像素格式。(在预乘格式中,红色、绿色和蓝色通道乘以alpha分量除以255。)(另请参见:)

额外的事实:这基本上就是Windows上的
QPixmap::fromImage
所做的。如果将带有alpha通道的
QImage
传递给该函数,则内部
QImage
将使用预乘alpha进行存储,以优化渲染性能

int w = width();
int h = w * glImage.height() / (double)glImage.width();
painter.drawImage(0, (height() - h) / 2, w, h, glImage);