Seite 1 von 2
[gelöst] zwei QPixmap zusammenlegen
Verfasst: 24. Juni 2005 08:28
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 ?

)
Gruss Arne
Verfasst: 24. Juni 2005 08:37
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.
Verfasst: 24. Juni 2005 09:52
von Christian81
Was wäre gegen
QPainter::drawPixmap einzuwenden?
Verfasst: 24. Juni 2005 10:31
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...
Verfasst: 24. Juni 2005 10:42
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 !?!?
Verfasst: 24. Juni 2005 10:46
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...
Verfasst: 24. Juni 2005 10:52
von Christian81
Was ist an 3 BitBlts langsam?
Ausserdem muss das ja nur einmal beim Start gemacht werden. Danach ab in QPixmapCache und fertig.
Verfasst: 24. Juni 2005 11:00
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.
Verfasst: 24. Juni 2005 11:05
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()...
Verfasst: 24. Juni 2005 17:16
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
Verfasst: 26. Juni 2005 16:02
von ArneStocker
Mit dem Vorschlag von Lepsei hat es leider nicht geklappt. Ich sehe jetzt durch die Umrisse des einen Bildches das andere
(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
Verfasst: 26. Juni 2005 17:15
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!
Verfasst: 26. Juni 2005 19:06
von lepsai
die Sourcen bitte ins Studio....
Verfasst: 27. Juni 2005 16:37
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
Verfasst: 27. Juni 2005 16:57
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.