Seite 1 von 1

[gelöst] Halbtransparenz von QPixmaps (Qt4.1)

Verfasst: 9. Februar 2006 20:50
von michams
Hi,

Gibt es eine Möglichkeit, ein QPixmap zu einem gewissen Teil transparent zu zeichnen, also daß das darunter liegende durchscheint? Ich vermute, die Alpha Funktionen hängen damit zusammen, allerdings ist die Doku da nicht wirklich hilfreich (zB "QPixmap::setAlphaChannel => Sets the alpha channel of this pixmap to alpha" Nein sowas aber auch, da wäre ich nie drauf gekommen)

Hintergrund: Ich konvertiere eine kleine, sagen wir mal "Designstudie", die ich irgendwann mal mit SDL angefangen, mich dann aber im Signalhandling ein wenig verheddert habe, nach Qt (um festzustellen, daß es damit generell viel besser geht). Es geht (zunächst) darum, ein eigenes Widget mit Tiles zu füllen, um eine Iso3d Oberfläche, in dem Fall eine Karte, zu erhalten.
Für die hartnäckigen Screenshot-Forderer: das Bild verdeutlicht wohl etwas mein Anliegen.
Der nächste Schritt ist nun, die Karte mit dem obligatorischen FOW (Fog of War) abzudecken. Dazu gibt es einmal eine komplett schwarze Fläche für unentdecktes Land und eine semi-transparente Fläche für entdecktes Land, das aber gerade nicht in Sichtweite einer Einheit ist (was später vielleicht mal folgt). Mit SDL kann man die Semitransparenz einfach über SetAlpha einstellen, mit Qt...tja! Wäre schade, wenn ich das über eine Rastermaske machen müßte.

Verfasst: 9. Februar 2006 21:36
von upsala
Entweder ein entsprechendes Pixmap mit Gimp erstellen und dann laden.

Oder wenn du QT4 verwendest dann hab ich mal folgenden Beispielcode ausprobiert, mit dem zu einem vorgegebens Pixmap einen Alpha-Kanal hinzufügen kannst.

#include <QtGui>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QPixmap pix(100, 100);
QPainter p(&pix);
p.fillRect(0, 0, 50, 50, QColor(255, 0, 0));
p.end();

QImage img(100, 100, QImage::Format_RGB32);
p.begin(&img);
p.drawPixmap(0, 0, pix);
p.end();

QImage img2(100, 100, QImage::Format_ARGB32_Premultiplied);
p.begin(&img2);
for (int x=0; x<100; x++)
{
for (int y=0; y<100; y++)
{
QColor col(img.pixel(x, y));
col.setAlpha((x+y)*1.5);

p.setPen(col);
p.drawPoint(x, y);
}
}
p.end();

QLabel *label=new QLabel(0);
label->setPixmap(QPixmap::fromImage(img2));

label->show();
return app.exec();
}


P.S. Ist die Grafik eigentlich von dir?

Verfasst: 10. Februar 2006 07:08
von michams
Entweder ein entsprechendes Pixmap mit Gimp erstellen und dann laden.
Stimmt, soweit hab ich jetzt gar nicht gedacht. Hab glaub ich sogar mal ein Tutorial dafür gesehen.
Oder wenn du QT4 verwendest dann hab ich mal folgenden Beispielcode ausprobiert...
Du holst also vom Bild, das seimi-transparent sein soll für jedes einzelne Pixel die Farbe und zeichnest es dann einfach mit der entsprechenden Alpha Information...interessant, werd ich auch mal probieren
P.S. Ist die Grafik eigentlich von dir?
Das Tileset selbst ist hauptsächlich von Freeciv. Die Grafik zeigt mein Widget in Aktion. Ich habe eine 2dimensionale Map, die u.a. die Geländeinfo für jedes einzelne Tile enthält. Die paint Routine des Widgets sucht sich dann anhand des gewählten zentrierten Punktes auf der Karte für alle sichtbaren Felder die Terraininfos zusammen und baut aus einer geladenen Pixmap das Bild auf.

Verfasst: 10. Februar 2006 17:44
von michams
Hab beide Methoden mal probiert. Die einzelnen Pixel zu zeichnen geht zwar, ist aber für meinen Anwendungsfall viel zu langsam.
Den Alphakanal im Bild abzuspeichern geht ohne Änderungen am Code genau so (siehe Bild)

Verfasst: 10. Februar 2006 22:02
von upsala
Ich seh gerade, daß es in QT4 mittlerweise leichter geht als in QT3, bei einem Pixmap die Transparenz hinzuzufügen:

Code: Alles auswählen

QPixmap pix(100, 100);
QPainter p(&pix);
p.fillRect(0, 0, 50, 50, QColor(255, 0, 0));
p.end();

QPixmap pix2(pix.size());
pix2.fill(QColor(128, 128, 128));

pix.setAlphaChannel(pix2);

Verfasst: 1. Juli 2007 06:52
von gerd87
Hallo,

das müsste doch auch mit einem QImage gehen, oder?

also ich male das Image so:

Code: Alles auswählen

painter.drawImage(10, 10, QImage(":/images/img.png"));
wie kann man da die Transparenz hinzufügen?
Habe es schon wie im Beispiel probiert.

Verfasst: 6. Juli 2007 14:18
von AnTeevY
Also ich hab mit Photoshop einem BMP-Bild einen Alphakanal hinzugefügt (wie ich das sonst auch bei TGAs mache, nur werden die nicht unterstützt) und habe es mit painter.drawPixmap(0,0,QPixMap("mouse.bmp")); geladen, allerdings wird das einfach normal dargestellt, der Alphakanal also ignoriert. setMask und setAlphaChannel bewirken auch nichts.
Wie kann man denn einfach ein Bild mit Alphakanal darstellen?!

Verfasst: 6. Juli 2007 14:27
von C_R
Versuchs doch mal mit .png files..bei Icons funktioniert dort der alphakanal, wenn ich mich recht erinner.

Verfasst: 6. Juli 2007 14:31
von AnTeevY
Danke, png habe ich aber zuallererst versucht, aber der Alphakanal scheint dort garnicht erst gespeichert zu werden. Zumindest ist er wieder weg, wenn ich die png das nächste mal in Photoshop lade.

Verfasst: 7. Juli 2007 15:44
von gerd87
ich habe es jetzt so hinbekommen:

Code: Alles auswählen

QPixmap pix = QPixmap(":/images/bild.png");
QPixmap pix2(pix.size());
pix2.fill(QColor(128, 128, 128)); 
pix.setAlphaChannel(pix2);
painter.drawPixmap(Breite, Hoehe, pix);