如何重复使用QImage?

How to use QImage repeatedly?

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

所有图片的宽度和高度都相同。我已将它存储在我的资源文件中,并通过 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的构造函数。知道一个 sprite 可以包含 +40 个图像并且我将多次需要这些图像,我应该在第一次调用图像时缓存图像,还是我这样做的方式很好?


注意:出于各种原因我需要 QImage,但如果能与 QPixmap 进行比较,我们将不胜感激。

用对象替换定义:

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 is designed and optimized for I/O, and for direct pixel access and manipulation, while QPixmap is designed and optimized for showing images on screen.

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