Seite 1 von 1

Alphablending

Verfasst: 6. Juli 2009 09:30
von JoseMan
Hi, ich komme einfach nicht weiter, folgendes:

Ich habe ein QIamge (ARGB) und ich möchte ein Transparentes Rechteck über eine Region des QImages, welches gerade in einem Childwindow angezeigt wird, mittels alphablending drüber zeichnen.
Das Problem ist nun, wenn ich bei meinem QImage den Alphawert auf max (255) setze, kann ich kein transparentes Rechteck mehr darüber zeichnen (also man sieht es da nicht mehr). Setze ich den Alphawert für das QImage auf z.B. 128, dann geht es, aber das QImage ist dann eben auch transparent und es "scheint" der Hintergrund des Fensters durch, das ist natürlich blöd!

Hier mal ein bissl Code:
1.) in meiner ChildWindow-Klasse (geerbt von QMainWindow) im Konstruktor.

Code: Alles auswählen

	mImage = new QImage(size(),QImage::Format_ARGB32);
In der PaintEvent-Methode zeichne ich:

Code: Alles auswählen

QPainter imagePainter(mImage);
zeichneBild(&imagePainter);

QPainter painter(this);

QSize size(size());
	painter.drawPixmap(0,0,size.width(),size.height(),QPixmap::fromImage(*mImage));
	
if(mSelectionRectImage)
{
	QSize selectRectSize(mSelectionRectImage->size());
  painter.drawPixmap(0,0,selectRectSize.width(),selectRectSize.height(),QPixmap::fromImage(*mSelectionRectImage));
	}

Und hier erzeuge ich des Rect:

Code: Alles auswählen

if(mSelectionRectImage==NULL)
	mSelectionRectImage = new   
       QImage(QSize(100,100),QImage::Format_ARGB32_Premultiplied);
			
	QPainter painter(mSelectionRectImage);
	QColor color(0,100,0,100);
	painter.fillRect(0,0,100,100,color);

       update();

Please, need Help!!

Verfasst: 6. Juli 2009 11:03
von Christian81
Wie sollte das so auch funktionieren? Wenn ich über ein Bild ein anderes zeichne welches transparent ist... was soll da passieren?
Du muss schon das zu zeichnende Bild direkt manipulieren.

Verfasst: 6. Juli 2009 11:17
von JoseMan
Christian81 hat geschrieben:Wie sollte das so auch funktionieren? Wenn ich über ein Bild ein anderes zeichne welches transparent ist... was soll da passieren?
Naja, jenachdem wie der Alphakanal aussieht. Voll-Transparent, Halb-Transparent oder eben garnicht transparent.
Du muss schon das zu zeichnende Bild direkt manipulieren.
Wozu gibt es dann sowas wie KompositionsModi?

bye

Verfasst: 6. Juli 2009 11:20
von Christian81
Vielleicht würde das auch funktionieren - allerdings sollte man im paintEvent() so wenig wie möglich machen damit die Performance nicht so leidet.

Verfasst: 6. Juli 2009 11:24
von JoseMan
Okay. Mmh, verstehe.
....
Also sollte ich mein eigenes Alpha-Blending schreiben?

Ciao J---

Verfasst: 6. Juli 2009 11:32
von Christian81
Wieso eigenes Alpha-Blending? Nimm dein Bild, setze den Alpha-Buffer und im Paint-Event lässt Du das Bild malen und fertig.

Verfasst: 6. Juli 2009 11:57
von JoseMan
Okay, danke für deine Tipps.
ich habe es nun hinbekommen. Letztendlich habe ich es auch so gemacht.
Also im PaintEvent mein QImage gezeichnet und dann

Code: Alles auswählen

QPainter::fillrect(QRect(..),QColor(..));
funktioniert prima!
wenn ich da jetzt rückblickend das betrachte, frage ich mich, wieso das so schwer war :?

Ciao