如何重复使用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。
我有一个水平的图像精灵。例如这个:
所有图片的宽度和高度都相同。我已将它存储在我的资源文件中,并通过 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。