[gelöst] zwei QPixmap zusammenlegen

Alles rund um die Programmierung mit Qt
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

[gelöst] zwei QPixmap zusammenlegen

Beitrag von ArneStocker »

Hallo

Gibt es eine legale Möglichkeit zwei QPixmap in folgender Weise (zu einem neuen Pixmap) übereinanderzulegen

"das neue Pixmap soll das alte überall da überschreiben, wo es nicht transparent ist"

Hintergrund :

Ich habe für meinen Objekte gelegentlich gesonderte Zustände (z.B. sind sie mit einem kleinen Schloss gesperrt weil ein anderer Anwender drauf zugreift oder sie haben eine kleine Stecknadel, weil der aktuelle Anwender drauf zugreift usw)

Da ich eine Menge Symbole verwende (wenn auch teilweis nur leicht abgewandelt) summiert sich der Aufwand doch erheblich. Schön wäre es ,wenn ich ein gleich grosses (und mit Ausnahme der Zusatzinfo transparentes) Pixmap in der oben genannten Weise zu einem neuen verschmelzen könnte. Ich brauche aber im Ergebnis wieder ein Pixmap, da die Symbole in QListViewItems dargestellt werden.

Schlimmstenfalls könnte ich noch die Paint Methode des QListView Items überlagern, da meine Items sowieso abgeleitet sind

Hat jemand eine Idee ? (... lepsai ? :lol:)

Gruss Arne
Zuletzt geändert von ArneStocker am 28. Juni 2005 15:57, insgesamt 1-mal geändert.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Klingt der Text, Gedankengang nur so umständlich oder bin ich das? ;)

Ich denke das geht viel einfacher.

Bild + Symbol( pos ) wäre doch sicherlich auch zutreffend, oder?

Wie genau das geht, keine Ahnung, aber vielleicht konnte ich ja mit dem Gedankengang helfen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was wäre gegen QPainter::drawPixmap einzuwenden?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Ich glaube, so könnte es gehen:

QPixmap pm1, pm2;

// Transparenz:
QBitmap bitMask1 = pm1. createHeuristicMask(); // hier ist kritisch, ich weiss nicht, ob der Pixmap eigene Transparenz erkennt

pm2 = pm1;
pm2.setMask(bitMask1);

irgendwas ist kommisch, wahrscheinlich noch zu früh aufgestanden... :)

Sag Bescheid, ob es funktioniert...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich versteh das Problem nicht... wenn ich 2 Symbole als png (als Beispiel) lade und diese korrekte Transparenzinformationen haben, muss ich doch nicht extra noch ne Mask erzeugen damit ich die beiden übereinander legen kann !?!?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Na ja, du könntest sie übereinander zeichnen, aber das nicht gerade effizient, da Qt beim Zeichnen von transparenten Regionen ziemlich langsam ist...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was ist an 3 BitBlts langsam?
Ausserdem muss das ja nur einmal beim Start gemacht werden. Danach ab in QPixmapCache und fertig.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Ja, langsam ist immer so eine Sache, wenn du z.B. einen Dual Opteron hast, stellt sich die Frage: Was ist denn wirklich noch langsam. Aber es gibt spezielle Klassen und Funktionen die einfach langsamer sind und nicht so effektiv, wie es sein könnte. Manche dieser werden in der Qt Dokumentation genannt. z.B. Konvertierung von QImage auf QPixmap oder andersherum.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Also in meinen Programmen ist Rendering von RGBA-Bildern erheblich langsamer als von RGB-Bildern. Ich erreiche bei RGB eben die Qualität von Photoshop (z.B beim Zooming, Scrolling usw.), aber bei RGBA ist es ziemlich lahmarschig. Woran es liegt weiß ich nicht, ich benutze auch nur BitBlts()...
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

hey, danke für die vielen antworten

um es nochmal klar zu machen :

Das Painten ist die zweitbeste Lösung, weil ich das geänderte Pixmap ja einem QListViewItem (und an einigen Stellen auch ein paar anderen Widgets übergeben will)

Ich brauche also am Ende wieder ein QPixmap Objekt, dass aus den beiden vorherigen zusammengesetzt ist.

Entschuldigung, dass ich das vielleicht nicht so klar ausgedrückt habe. Den Vorschlag von lepsai werde ich mal aufgreifen.

Gruss Arne
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Mit dem Vorschlag von Lepsei hat es leider nicht geklappt. Ich sehe jetzt durch die Umrisse des einen Bildches das andere :roll:

(siehe beigefügtes Attachment)


Jetzt fällt mir nur noch die Möglichkeit ein, beide Bildchen auf ein Paindevice zu zeichnen und dann das ganze zurückzulesen.

Gibt's wirklich keine andere Möglichkeit ?

Gruss Arne
Dateianhänge
lupeakte2.jpg
lupeakte2.jpg (5.32 KiB) 9287 mal betrachtet
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

ArneStocker hat geschrieben:hey, danke für die vielen antworten

um es nochmal klar zu machen :

Das Painten ist die zweitbeste Lösung, weil ich das geänderte Pixmap ja einem QListViewItem (und an einigen Stellen auch ein paar anderen Widgets übergeben will)

Ich brauche also am Ende wieder ein QPixmap Objekt, dass aus den beiden vorherigen zusammengesetzt ist.
Lies bitte nochmal was Du da geschrieben hast und schau Dir dann mal die Doku von QPixmap an!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

die Sourcen bitte ins Studio....
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Christian81 hat geschrieben: Lies bitte nochmal was Du da geschrieben hast und schau Dir dann mal die Doku von QPixmap an!
Hallo Christian

ich weiss was ich geschrieben habe und ich hoffe es stimmt mittlerweile in etwa mit dem überein, was ich sagen wollte :-)

In der Doku habe ich nichts gefunden, sonst hätte ich ja hier nicht gefragt. Vielleicht habe ich ja auch Tomaten auf den Augen. Wenn das (ich nenn es jetzt mal Kopieren) eines QPixmap Objektes mit transparenten Informationen auf ein anderes so offensichtlich ist, dann sei doch bitte so nett und sage mir wie. Zum Beispiel in der Art

Code: Alles auswählen

QPixmap eins;                                                      // Bildchen1 
QPixmap zwei;                                                    // Bildchen2, teilweise transparent
eins.<..hierFehltMirEineMethode..>.(zwei):   // Bildchen2 über Bildchen1, Bildchen1 dort zu sehen, wo Bildchen 2 transparent ist
Gruss (und Danke)

Arne
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ok, dann probiers mal damit:

Code: Alles auswählen

QPixmap p1, p2;
p1.load("bild.png");
p2.load("mini.png");
QPainter p( &p1 );
p.drawPixmap( 5, 5, p2 );
p.end()
p1.save("merged.png","PNG");
so sollte es auf alle Fälle gehen, evtl. habe ich ein paar '&' oder '*' vergessen ...

Was ich sagen wollte - QPainter ist von QPaintDevice abgeleitet, also kannst Du auch QPainter p( QPixmap() ) und somit auch drawPixmap benutzen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten