如何反复使用QImage?

时间:2017-12-07 15:09:15

标签: c++ qt qimage

我有一个水平的图像精灵。例如:

enter image description here

所有图像都具有相同的宽度和高度。我已将其存储在我的资源文件中,并通过 define 在我的应用程序中声明:

#define SPRITE QImage(":/sprite.png")

因此,在我的应用程序中,我需要多次使用4张图像。为了做到这一点,我实现了这个函数,它在精灵中的 n 位置检索图像。

QImage getNthImageFromSprite(int n, QImage sprite)
{
    int size = sprite.height();
    return sprite.copy((n - 1) * size, 0, size, size);
}

然后,我宣布了一个通用的枚举,将名字放在这个位置上:

enum eImage
{
    eImage_black = 1,
    eImage_red,
    eImage_orange,
    eImage_green
}

最后,我在我的应用程序中的任何地方使用的功能:

QImage getSpriteImage(eImage img)
{
    return getNthImageFromSprite(img, SPRITE);
}

效果很好

但我的印象是这不是很好,因为我每次想要获得特定图像时都会调用QImage的构造函数。知道精灵可以包含+40个图像并且我需要多次这些图像,我应该在第一次调用图像时缓存图像,还是我这样做的方式是好的?

注意:出于各种原因我需要QImage,但是可以与QPixmap进行比较。

1 个答案:

答案 0 :(得分:2)

用对象替换define:

static QImage SPRITE(":/sprite.png");

它将在启动时初始化一次。

你甚至可以把它放在方法中:

QImage getSpriteImage(eImage img)
{
    static QImage SPRITE(":/sprite.png");
    return getNthImageFromSprite(img, SPRITE);
}

在这种情况下,它会在首次使用时初始化。

然后,您每次拨打getNthSpriteImage时都会创建新对象。您可以使用本地静态缓存重用已返回的对象:

QImage getNthSpriteImage(int n, QImage img) {
    static QMap<int, QImage> cache;
    if (!cache.contains(n)) {
        int size = sprite.height();
        cache[n] = sprite.copy((n - 1) * size, 0, size, size);
    }
    return cache[n];
}

至于QImage / QPixmap的区别,这是主要区别:

  

QImage专为I / O设计和优化,适用于直接像素访问和操作,而QPixmap专为在屏幕上显示图像而设计和优化。

因此,如果您不想要特殊的图像格式(RGBA,预乘RGBA,索引,...)或使用直接像素操作,我建议您使用QPixmap。