Seite 1 von 1

QImage::scanLine Problem

Verfasst: 12. Mai 2007 02:35
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.

Verfasst: 12. Mai 2007 10:02
von Christian81
Einfach ein neues Bild erstellen und beide per QPainter::drawPixmap() dort reinkopieren.

Verfasst: 14. Mai 2007 02:40
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?

Verfasst: 14. Mai 2007 06:55
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 :)