Seite 1 von 1

Absturz von Qt bei QImage

Verfasst: 27. Juni 2008 14:29
von pospiech
Hier die Aufrufliste:
QtGuid4.dll!6517cff0()
[Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder fehlen, keine Symbole geladen für QtGuid4.dll]
QtGuid4.dll!6517c0a8()
QtGuid4.dll!6517c030()
QBeamShapingd.exe!QImage::`scalar deleting destructor'() + 0x43 Bytes C++
> QBeamShapingd.exe!GratingVariationExternalMovie::SaveImage(QImage * image=0x00dce0d0, const int number=1) Zeile 275 + 0x12 Bytes C++
QBeamShapingd.exe!GratingVariationExternalMovie::createImages(const int i=44, const int number=1) Zeile 255 C++
QBeamShapingd.exe!GratingVariationExternalMovie::runThread() Zeile 236 C++
QBeamShapingd.exe!GratingVariationExternalMovie::run() Zeile 223 C++
in der Funktion

Code: Alles auswählen

	void SaveImage(QImage * image, const int number)
	{		
		QSize Monitor = QSize(1024,768);
		QImage  * saveimage = new QImage(Monitor.width(),Monitor.height(), QImage::Format_RGB32);
		saveimage->fill(QColor(0,0,0).rgb());

		QPainter painter( saveimage );
		int offsetx = (Monitor.width() - image->width())/2;
		painter.drawImage(offsetx, 0, *image );

		for (int j = 0; j < number; j++)
		{
			QString imagesavename = m_DirFileName + "-image-" + QString("%1").arg(m_Iteration) + ".png";
			saveimage->save(imagesavename,"PNG");
			emit signalNewImageSaved(m_Iteration);
			++m_Iteration;
		}
		delete saveimage;
	}
Was ich daran nicht verstehe ist, dass 143 Bilder gepspeichert wurden bevor der Fehler auftauchte. Muss ich nun etwas ändern?

Matthias

Verfasst: 1. Juli 2008 13:07
von Christian81
Warum speicherst du n-mal das gleiche Bild?

Warum es crasht ist nicht ersichtlich - bau mal ein kleines Testcase damit wir es auch reproduzieren können.

/edit: Außerdem fehlt ein QPainter::end() sehe ich gerade

Verfasst: 1. Juli 2008 16:43
von pospiech
Christian81 hat geschrieben:Warum speicherst du n-mal das gleiche Bild?
Ich will einen Film erzeugen. Das mache ich mit Virtualdub. Ich würde es auch direkt aus dem C++ Programm erzeugen, wenn ich wüsste wie. Als animiertes gif kann ich es allerdings nicht machen, da es sich hier um >> 1k Bilder handelt.
Christian81 hat geschrieben: Warum es crasht ist nicht ersichtlich - bau mal ein kleines Testcase damit wir es auch reproduzieren können.
Ich habe den Pointer von saveimage weggenommen und es als normales Objekt Variable erzeugt, und seitdem habe ich kein Problem mehr. Kann es sein, dass Qt die save Anweisung intern threaded und es sein kann das die Objekte noch nicht gespeichert wurden bevor das delete aufgerufen wurde?

Sieht dann jetzt so aus:

Code: Alles auswählen

	void SaveImage(QImage * image, const int number)
	{		
		QSize Monitor = QSize(1024,768);
		QImage saveimage = QImage(Monitor.width(),Monitor.height(), QImage::Format_RGB32);
		saveimage.fill(QColor(0,0,0).rgb());

		QPainter painter( &saveimage );
		int offsetx = (Monitor.width() - image->width())/2;
		painter.drawImage(offsetx, 0, *image );

		for (int j = 0; j < number; j++)
		{
			QString imagesavename = m_DirFileName + "-movie-" + QString("%1").arg(m_Iteration) + ".png";
			saveimage.save(imagesavename,"PNG");
			emit signalNewImageSaved(m_Iteration);
			++m_Iteration;
		}
		painter.end();		
	}