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

Alles rund um die Programmierung mit Qt
Antworten
michams
Beiträge: 56
Registriert: 14. November 2005 18:24

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

Beitrag 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.
Dateianhänge
world.png
world.png (64.08 KiB) 5751 mal betrachtet
Zuletzt geändert von michams am 10. Februar 2006 17:46, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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?
michams
Beiträge: 56
Registriert: 14. November 2005 18:24

Beitrag 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.
michams
Beiträge: 56
Registriert: 14. November 2005 18:24

Beitrag 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)
Dateianhänge
Tilemap-Widget mit teilweise transparentem &quot;Fog of War&quot;
Tilemap-Widget mit teilweise transparentem "Fog of War"
alpha_preview.png (17.68 KiB) 5737 mal betrachtet
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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);
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag 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.
AnTeevY
Beiträge: 19
Registriert: 1. Juli 2006 20:57

Beitrag 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?!
C_R
Beiträge: 129
Registriert: 25. April 2007 15:12

Beitrag von C_R »

Versuchs doch mal mit .png files..bei Icons funktioniert dort der alphakanal, wenn ich mich recht erinner.
AnTeevY
Beiträge: 19
Registriert: 1. Juli 2006 20:57

Beitrag 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.
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag 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);
Antworten