Optimierung von QPixmap loadFromData?

Alles rund um die Programmierung mit Qt
Antworten
Matze-o
Beiträge: 24
Registriert: 6. Dezember 2006 11:54

Optimierung von QPixmap loadFromData?

Beitrag 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
Tarek
Beiträge: 46
Registriert: 3. Oktober 2005 14:29
Kontaktdaten:

Beitrag 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.
Matze-o
Beiträge: 24
Registriert: 6. Dezember 2006 11:54

Beitrag von Matze-o »

Danke für den Tip, aber das hat leider nichts gebracht.
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag 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.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Matze-o
Beiträge: 24
Registriert: 6. Dezember 2006 11:54

Beitrag von Matze-o »

Hmm, ok danke ich werde das mal ausprobieren, soweit ich das syntaktisch verstanden habe :)
Antworten