我目前正在从解码器中读取图像并在窗口小部件中绘制它的每一帧。 这就是我现在正在做的事情:
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,有没有解决方法?
答案 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