难以存储QImage然后恢复它

时间:2010-06-25 16:51:55

标签: c++ qt

好吧我正在尝试在许多图像绘制程序中实现类似于'撤消'功能的东西。我遇到的问题是:我正在尝试在QVector中制作QImage对象的备份副本(最多可存储10个最新的QImage副本以备份),然后尝试在另一个函数中检索这些备份。问题是备份没有正确创建(因为当我尝试恢复备份映像时,没有任何反应)。我知道问题在于备份部分,而不是在恢复部分,因为当我备份一个红色背景的新临时图像时,它恢复得很好..

这是备份功能代码:

imageBackups.append(image);

其中'image'是我正在尝试备份的QImage对象..

这是一个备用备份(存储红色背景图像) - 我用它来看看这个版本的备份是否有效,它确实如此:

QImage newImage(QSize(100,100), QImage::Format_RGB32);
newImage.fill(qRgb(255, 0, 0));
imageBackups.append(newImage);

这是恢复代码:

image =imageBackups.at(imageBackups.size()-1);
QPainter painter(&image);
painter.drawImage(QPoint(0,0),imageBackups.at(imageBackups.size()-1));

'image'的定义与上面的newImage完全相同,但在这种情况下大小为800x400 ..

3 个答案:

答案 0 :(得分:1)

当newImage超出范围时,它开始被解构,我猜测追加是在进行某种浅层复制,它只存储对图像的引用。 QT使用一些对象进行自动引用计数,但我不记得细节

尝试使用new创建QImage并将指针存储在imageBackups中(无论如何都是一种更好的方法)。

像这样的东西(注意imageBackups现在需要是QIMage *的数组)

QImage pImage = new QImage(QSize(100,100), QImage::Format_RGB32);
pImage->fill(qRgb(255, 0, 0));
imageBackups.append(pImage);

答案 1 :(得分:0)

这可能与您创建图像的方式有关。如果您使用其中一个带有uchar *缓冲区(const或不带{1}}的构造函数,则必须确保缓冲区在QImage及其副本的整个生命周期内有效:

http://doc.trolltech.com/latest/qimage.html#QImage-5

如果在从QVector恢复图像时,缓冲区被删除,则恢复的QImage将使用一些陈旧的内存位置作为缓冲区。

答案 2 :(得分:0)

我认为您的恢复代码可能有问题。也许从实际代码转移到问题只是一个错字,但你应该调查一下。以下是我解析恢复代码的方法。

// Get the image that is back one.
image =imageBackups.at(imageBackups.size()-1);
// Create a painter onto the backup image
QPainter painter(&image);
// Paint the backup image in the painter (onto the backup image).
painter.drawImage(QPoint(0,0),imageBackups.at(imageBackups.size()-1));

我无法看到这是如何完成任何事情的,这可以解释为什么在你恢复时似乎没有任何事情发生。