PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [QT] Zwei transparente Pixmaps übereinander



sohler
19-07-2005, 14:09
Hallo,

ich möchte zwei transparente Pixmaps übereinader ausgeben, so dass die resultierende Pixmap auch transparent bleibt.

Ich habe folgendes ausprobiert:


// zwei PNGs mit transparentem Anteil
QPixmap pix1("pic1.png");
QPixmap pix2("pic2.png");

// resultierende Pixmap
QPixmap resultPix(pix1.width(), pix1.height());

// die zwei PNGs in resultierende Pixmap zeichnen
QPainter p(&resultPix);
p.drawPixmap (0, 0, pix1);
p.drawPixmap (0, 0, pix2);


Die Pixmaps liegen auch so in der resultierenden Pixmap, wie man das erwartet. Nur, da wo die Pixmaps transparent sind, ist jetzt die Hintergrundfarbe der resultierenden Pixmap. Ich möchte aber, dass die Transparenz erhalten bleibt. Wie kann man das machen?

Gruß,
S. Ohler

anda_skoa
20-07-2005, 13:15
Das resultPix hat vielleicht keinen Alpha Channel. Schon mal hasAlpha davon aufgerufen?

Eventuell kann man als Workaround auch die beiden Masks der Quellbilder verknüpfen und als Mask des Zielbildes setzen.

Oder vielleicht ein volltransparentes Zielpixmap erzeugen und die anderen draufblitten

Ciao,
_

sohler
20-07-2005, 16:22
Hallo !



Das resultPix hat vielleicht keinen Alpha Channel. Schon mal hasAlpha davon aufgerufen?

Das resultPix hat keinen Alpha Channel.



Eventuell kann man als Workaround auch die beiden Masks der Quellbilder verknüpfen und als Mask des Zielbildes setzen.

Das habe ich mal probiert. Sieht ungefähr so aus:


// zwei PNGs mit transparentem Anteil
QPixmap pix1("pic1.png");
QPixmap pix2("pic2.png");

int w = pix1.width();
int h = pix1.height();

// Masken holen und fürs Mergen in Image wandeln
QBitmap pix1Mask = *pix1.mask();
QBitmap pix2Mask = *pix2.mask();
QImage pix1MaskImage = pix1Mask.convertToImage ();
QImage pix2MaskImage = pix2Mask.convertToImage ();

// Image für Maske erstellen
QImage resultMaskImage (w, h, 1, 2, QImage::BigEndian);
resultMaskImage.setColor( 0, 0xffffff );
resultMaskImage.setColor( 1, 0 );
resultMaskImage.fill( 0xff );

// Masken zusammen mergen
uchar* pbr = resultMaskImage.bits();
uchar* pp1 = pix1MaskImage.bits();
uchar* pp2 = pix2MaskImage.bits();

// Bit: 0 - tranparent, 1 - farbe
for (int i = 0; i < resultMaskImage.numBytes(); i++)
{
pbr[i] = pp1[i] | pp2[i];
}

// gemergtes Image wieder nach QBitmap wandeln
QBitmap resultMask;
resultMask.convertFromImage (resultMaskImage);

// resultierende Pixmap erstellen ...
QPixmap resultPix(w, h);

// ... und Maske anwenden
resultPix.setMask (resultMask);

// die zwei PNGs in resultierende Pixmap zeichnen
QPainter p(&resultPix);
p.drawPixmap (0, 0, pix1);
p.drawPixmap (0, 0, pix2);



Das funktioniert :D Sieht aber irgendwie wild aus und ist bestimmt nicht schnell :(

Gruß,
S. Ohler