gpt4 book ai didi

c++ - 如何重复使用QImage?

转载 作者:行者123 更新时间:2023-11-28 01:39:51 24 4
gpt4 key购买 nike

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

enter image description here

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

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

因此,我将在我的应用程序中多次使用 4 张图像。为了做到这一点,我实现了这个函数来检索 Sprite 中 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。

关于c++ - 如何重复使用QImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47698053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com