[gelöst] Halbtransparenz von QPixmaps (Qt4.1)
[gelöst] Halbtransparenz von QPixmaps (Qt4.1)
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.
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 (64.08 KiB) 5747 mal betrachtet
Zuletzt geändert von michams am 10. Februar 2006 17:46, insgesamt 1-mal geändert.
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?
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?
Stimmt, soweit hab ich jetzt gar nicht gedacht. Hab glaub ich sogar mal ein Tutorial dafür gesehen.Entweder ein entsprechendes Pixmap mit Gimp erstellen und dann laden.
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 probierenOder wenn du QT4 verwendest dann hab ich mal folgenden Beispielcode ausprobiert...
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.P.S. Ist die Grafik eigentlich von dir?
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)
Den Alphakanal im Bild abzuspeichern geht ohne Änderungen am Code genau so (siehe Bild)
- Dateianhänge
-
- Tilemap-Widget mit teilweise transparentem "Fog of War"
- alpha_preview.png (17.68 KiB) 5733 mal betrachtet
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);
Hallo,
das müsste doch auch mit einem QImage gehen, oder?
also ich male das Image so:
wie kann man da die Transparenz hinzufügen?
Habe es schon wie im Beispiel probiert.
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"));Habe es schon wie im Beispiel probiert.
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?!
Wie kann man denn einfach ein Bild mit Alphakanal darstellen?!
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);