QImage::scanLine Problem

Alles rund um die Programmierung mit Qt
Antworten
GloomY
Beiträge: 6
Registriert: 12. Mai 2007 02:20

QImage::scanLine Problem

Beitrag von GloomY »

Hi,

ich will eine Klasse schreiben, die von QImage abgeleitet ist und die einen "+"-Operator hat. Dieser soll ein Bild erweitern und zwar so, dass rechts neben dem alten das neue direkt angefügt wird. Gleiche Höhe der beiden Bilder ist Voraussetzung.

Soweit bin ich momentan:

Code: Alles auswählen

class myImage : public QImage
{
	public:
		myImage();
		myImage(int width, int height, Format format);
		myImage operator+ (myImage &rechts);
};
und

Code: Alles auswählen

myImage::myImage()
{}

myImage::myImage(int w, int h, Format f)
: QImage(w, h, f)
{}

myImage myImage::operator+ (myImage &rhs)
{
	if(height() != rhs.height())
	{
		qDebug() << "myImage operator+ : height != rhs.height!";
		return *this;
	}

	myImage erg(
		width() + rhs.width(),
		height(),
		QImage::Format_ARGB32
	);

	int i;
	for(i=0; i < height(); ++i)
	{
		QRgb* thisPtr = (QRgb*)    scanLine(i);
		QRgb* ergPtr  = (QRgb*)erg.scanLine(i);
		QRgb* rhsPtr  = (QRgb*)rhs.scanLine(i); // nur korrekt mit i-1

		// eine Zeile kopieren
		int j;
		for(j=0; j < width(); ++j) // zuerst die Daten links
			ergPtr[j] = thisPtr[j];
		for(; j < width() + rhs.width(); ++j) // dann rechts
			ergPtr[j] = rhsPtr[j];
	}
	return erg;
}


int main(int argc, char** argv)
{
	QApplication app(argc, argv);

	myImage img1, img2;
	if(!(img1.load("./1.png") && img2.load("./2.png")))
	{
		qDebug() << "konnte keine Bilder laden!";
		exit(1);
	}

	qDebug() << "img1.width():" << img1.width() << "img1.height():" << img1.height();
	qDebug() << "img2.width():" << img2.width() << "img2.height():" << img2.height();

	myImage tmp = img1 + img2;
	bool success = tmp.save("neu.png");
	qDebug() << success;

	return 0;//app.exec();
}
Das Problem ist nun aber, dass im zusammengesetzen Bild das rechte Bild immer genau um eine Zeile nach oben rutscht, das linke ist in Ordnung. Ich habe das mit verschiedenen Bildern ausprobiert. Die unterste Zeile des rechten Bildes ist immer leer. :(

Ich versteh's einfach nicht. Die Qt-Doku sagt auch, dass der Index bei scanLine() bei 0 beginnt, wie kann es dann mit -1 (i ist zuerst 0) überhaupt funktionieren? Und wieso gerade beim rechten Bild und beim linken nicht?


Ich benutze Qt 4.2.0 unter Windows mit dem MingW-Compiler.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Einfach ein neues Bild erstellen und beide per QPainter::drawPixmap() dort reinkopieren.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
GloomY
Beiträge: 6
Registriert: 12. Mai 2007 02:20

Beitrag von GloomY »

Christian81 hat geschrieben:Einfach ein neues Bild erstellen und beide per QPainter::drawPixmap() dort reinkopieren.
Okay, ich werd's mir mal anschauen.

Das erklärt aber immer noch nicht meine Frage warum das nicht so geht, wie ich das machen wollte...

Funktioniert denn obiger Code bei dir? Kannst du meinen Fehler nachvollziehen?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Warum es so ist weiss ich nicht genau. Ich weiss nur dass deine Routine nur funktionieren kann wenn die Bilder (a)RGB32 sind - in jedem anderen Fall kann es nicht funktionieren :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten