Seite 1 von 1

Optimierung von QPixmap loadFromData?

Verfasst: 25. Januar 2007 10:16
von Matze-o
Moin,
ich versuche schon seit etwas längerem diesen Code zu optimieren, das ins pixmap laden dauert zu lange, es dauert etwa 47ms und sollte ungefähr halbiert werden, das wäre schön. Kann ich beim Zeichnen nicht direkt aus dem ram lesen? Etwas in der Art?

In Header steht der bmp header drin und ich benutze das aktuelle Qt

Code: Alles auswählen

		filer->startTimer(0);
		memcpy(bmp,header,56);					//kopiert den Inhalt von "header" in "bmp"
		memcpy(bmp+56,(char*)pic,3000000);		//kopiert den Inhalt von "pic" in "bmp"
		filer->write("memcpy: ");
		filer->putRecordedTime(0);

		filer->startTimer(0);
		m_pPixmap->loadFromData((const unsigned char*)bmp,30000056,"");
		filer->write("load into image: ");
		filer->putRecordedTime(0);

		filer->startTimer(0);
		m_pPainter = new QPainter(this);		//benötigt, um das Bild zu erzeugen
		m_pPainter->drawPixmap(0,0,*m_pPixmap);	//das Bild wird erzeugt
		filer->write("draw image: ");
		filer->putRecordedTime(0);
Danke schonmal

Verfasst: 25. Januar 2007 13:03
von Tarek
Hallo,
Die Benutzung von QImage und drawImage() könnte etwas schneller gehen, weil die loadFromData() Funktion von QPixmap intern ein QImage-Objekt erzeugt und das dann anschließend in eine QPixmap umwandelt was einen unötigen Kopiervorgang bedeutet. Allerdings ist QImage auch nicht gerade die Effizienzkanone weil soweit ich das gesehen habe kopiert das loadFromData() die Daten zweimal herum obwohl nur einmal nötig wäre.

Verfasst: 25. Januar 2007 13:17
von Matze-o
Danke für den Tip, aber das hat leider nichts gebracht.

Verfasst: 25. Januar 2007 14:47
von Volker
Hab grad keine genauen Infos über den Aufbau von Bitmaps, aber wenn Du in deiner Variablen "pic" eh schon nur die Pixelwerte stehen hast, dann könntest du's evtl. als Textur in nem OpenGL Kontext darstellen.
Siehe dazu auch der Thread hier

Wenn Du die Dimensionen, Farbtiefe und den Pointer auf die Pixelwerte hast, kannst du recht einfach das ganze anzeigen lassen und über OpenGL sollte das ganze recht schnell zu realisieren sein.
Das einzige Problem was es geben könnte, ist dass BMPs soweit ich weiss immer 4Byte aligned sind. Evtl. kommt es dann zu fehlerhaften Darstellungen wenn Du Bilder hast, deren Breite * Farbtiefe (in bit) nicht durch 32 Teilbar ist.

Desweiteren unterstützt die Klasse wie ich sie im anderen Thread angehängt habe zur Zeit nur 8, 24 und 32bit Bilder.

Verfasst: 25. Januar 2007 15:05
von Matze-o
Hmm, ok danke ich werde das mal ausprobieren, soweit ich das syntaktisch verstanden habe :)