Ahmad
Ahmad

Reputation: 13436

Having difficulty in storing a QImage and then recovering it

Ok well I'm trying implement something similar to the 'undo' function in many image drawing programs .. The problem I'm having is this: I'm trying to make a backup copy of a QImage object in a QVector (which stores upto 10 latest QImage copies for backup purposes), and then try to retrieve these backups in another function. The issue is that the backup is not being created properly (since when I try to recover a backuped image, nothing happens). I know the problem is somewhere in backing up part and not in the recovering part, since when I backup a new temporary image with a red background, it recovers perfectly ..

This is the backing up function code:

imageBackups.append(image);

where 'image' is the QImage object that I'm trying to backup ..

This is an alternate backing up (stores a red colored background image) - I used this just to see if this version of backing up works, which it does:

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

And here is the recovering code:

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

'image' is defined exactly like newImage above, except the size which is 800x400 in this case..

Upvotes: 2

Views: 509

Answers (3)

Caleb Huitt - cjhuitt
Caleb Huitt - cjhuitt

Reputation: 14951

I think you might have something wrong with your recovery code. Perhaps it was just a typo when transferring from your actual code to the question, but you should look into it. Here is how I parse the recovery code.

// 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));

I can't see how this accomplishes anything, which might explain why nothing seems to happen when you are recovering.

Upvotes: 0

Martin Beckett
Martin Beckett

Reputation: 96167

The newImage is begin destructored when it goes out of scope, I'm guessing that the append is doing some sort of shallow copy where it only stores a reference to the image. QT does automatic reference counting with some objects, but I can't remember the details

Try creating the QImage with new and storing the pointer in imageBackups ( a better approach anyway).

Something like this ( note imageBackups now needs to be an array of QIMage* )

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

Upvotes: 1

Stephen Chu
Stephen Chu

Reputation: 12832

It may has something to do with how you created image. If you use one of the constructors that takes a uchar * buffer (const or not), you have to make sure the buffer is valid through out the life of the QImage and its copies:

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

If at the time of your restoring of the image from QVector, the buffer is deleted, the restored QImage will be using some stale memory location as it's buffer.

Upvotes: 0

Related Questions