Qt:优化油漆事件

时间:2015-02-02 14:22:08

标签: c++ qt

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

 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,有没有解决方法?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

QPixmap pmap = QPixmap::fromImage(glImage);
int w = width();
// "scaledToWidth"
int h = w * pmap.height() / (double)pmap.width();
painter.drawPixmap(0, (height() - h) / 2, w, h, pmap);

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

例如,在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。)(另请参阅:QImage::Format_ARGB32_Premultiplied is your friend)。

奖金事实:这基本上是Windows上的QPixmap::fromImage。如果您将带有Alpha通道的QImage传递给该函数,则内部QImage将与预乘alpha一起存储,以优化渲染性能。 See source code