[gelöst] zwei QPixmap zusammenlegen

Alles rund um die Programmierung mit Qt
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Wenn der Vorschlag von Christian nicht funktionieren sollte( ich vermute, da wird p1 durch p2 einfach überschrieben und nicht gemerged), dann mach es auf der Bildebene:

Code: Alles auswählen

QImage i1 = pixmap1.convertToImage();
QImage i2 = pixmap2.convertToImage();

for(int x = 0; x < i1.width(); x++)
for(int y = 0; y < i1.width(); y++)
{
QRgb rgb1 = i1.pixel(x,y);
QRgb rgb2  = i2.pixel(x,y);

if( qAlpha(rgb2) == 255 /*oder 0, das vergesse ich immer*/) // rgb2 transparent
{
rgb1 = qRgba(qRed(rgb1), qGreen(rgb1), qBlue(rgb1), 0 /*oder 255*/); // transparenz ausschalten
i1.setPixel(x,y, rgb1);
}
}
}
Wenn noch nicht geschehen, müssen natürlich alle Werte von i1 vor dem Bilddurchlauf auf transparent gesetzt werden.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

lepsai hat geschrieben:Wenn der Vorschlag von Christian nicht funktionieren sollte( ich vermute, da wird p1 durch p2 einfach überschrieben und nicht gemerged), dann mach es auf der Bildebene:
Zumindest nicht laut Doku ("Currently the mask of the pixmap or it's alpha channel are ignored when painting on a QPrinter.") oder in Qt3/free und Qt3.2.1 non commercial :D
MfG Christian

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

Beitrag von lepsai »

Das verstehe ich aber so, dass die Transparenz beim Drucken verworfen wird... oder?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ja, und umgekehrt das es überall anders funktioniert, sonst wäre der Satz sinnlos :)
MfG Christian

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

Beitrag von lepsai »

Nein, nein - das heisst ja nur, dass wenn ich ein was Transparentes drucke, geht es nicht und wenn ich sonst etwas transparent zeichne geht es, was auch der Fall ist. D.h. wenn ich ein transparentes Pixmap zeichne, wird dies korrekt ausgeführt, die Frage ist aber, ob der Inhalt von dem PaintDevice in dem ich zeichne, in unserem Fall ein anderes Pixmap, berücksichtigt wird... Und da habe ich so meine Zweifel. Ich denke aber, man sollte einfach ausprobieren, sonst ist es hier eher eine philosophische Disskusion :)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wie ich schon sagte - dann müsste 3.2.1 non commercial und die Implementation in Qt3.3/free falsch sein. Und wenn die falsch wäre würden die daraus resultierenden Qt-Programme ganz schön doof aussehen, glaub mir...
MfG Christian

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

Beitrag von lepsai »

Wenn du sowas schon umgesetzt hast und es lief, dann ist es gar keine Frage. Wenn nicht, dan sollte man es einfach probieren. Aus der Doku ist es nicht ersichtlich, weil es dort um das Zeichnen des Overlays und nicht des Underlays geht.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Hab jetzt ausprobiert, die Transparenz des Underlays wird tatsächlich berücksichtigt. Also, frohes Schaffen!
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

danke für die Tipp's das war's gewesen

Da allerdings sowohl das alte als auch das neue Pixmap transparente Informationen hat und ich im Nachhinein die Transparenz benötige habe ich auf die gleiche Weise noch die Masken kombiniert.

Code: Alles auswählen

void CopyPixToPix(const QPixmap &source,QPixmap &destination)
{
    // Masken beider Pixmap auslesen
    QBitmap     sourceMask = *source.mask();
    QBitmap     destinationsMask = *destination.mask();

    // Masken kombinieren
    QPainter    maskPainter(&destinationsMask);
    maskPainter.setRasterOp(Qt::OrROP);
    maskPainter.drawPixmap(0,0,sourceMask);

    // Maske für destination neu setzen und mit source überschreiben
    destination.setMask(destinationsMask);
    QPainter    painter(&destination);
    painter.drawPixmap(0,0,source);
    painter.end();
}	
anbei den Source und das Ergebnis (der Hintergrund ist nur zu Testzwecken wg. der Transparenz)

Gruss Arne
Dateianhänge
akteschloss.JPG
akteschloss.JPG (5.71 KiB) 5691 mal betrachtet
Antworten