Transparente Farbe wird Schwarz

Danke Danke
Hab zwar noch nicht alles in die Tiefe verstanden, aber es :) :) :)
Soweit ich gesehen habe machen die beiden For-Schleifen aber nicht viel anderes als BitBlit oder?
Kann es Sein, das in der ersten auch nen Fehler ist? Statt "<=" müsste "<" sein oder?

Jetzt muss ich noch ins Detail verstehen und vielleicht seh ich ja auch noch den Fehler von meinem Quellcode

Gruss Michael
 
Ja, das ist schon so eine Art Low Level BitBlt ;)
Soweit ich mich errinnere, war das mal sein Samplecode von MS und mit den for-Schleifen und Zeiger-Offsets hatte ich auch einige Zeit herumgemurkst. Es sollte eigentlich so ok sein.

Diese Variante ist recht flexibel. Man kann ohne große Mühe z.B. einzelne Farben tauschen oder Alphablending implementieren.

Gruss
Matthias
 
Guten Morgen
Hab seiner Zeit mal mit DirektX rum experimentiert. Und wenn ich das hier so richtig sehe ist in "bmPic.bmBits" das Bild doch in einer "Zeile" organisiert. An einen Bildpunkt kommt man doch dann über:

Punkt(x,y) = bmPic.bmBits[bmPic.Width*y+x];

Wenn da nix gegen spricht ist das doch ne optimale Optimierung durch Bitoperationen...

Wenn ich da was optimiert bekomme werde ich das mal posten, denn ich muss etwas Zeit und Anzeige optimieren. Darf am Ende keine Geflackere mehr haben :) , aber das kommt erst wenn alles andere fertig ist:)

Gruss Michael
 
Hallo Michael,

im Prinzip hast du schon recht, allerdings hängt die Breite eines Bildpunktes von der Farbtiefe ab ( hier 3 Byte == sizeof(RGBTRIPLE) ) und die Zeilenlänge ist auch nicht immer identisch mit "bmPic.Width", siehe meinen Kommentar im Sourcecode.
Daher erzeuge ich die Bitmaps auch mit der Funktion "Create24BPPDIBSection()" um sozusagen "klare Verhältnisse" zu schaffen.

Erste Optimierung: Die Berechnung von "iPicAdd" und "iBgrAdd" kann natürlich aus der Schleife raus.

Jedenfalls viel Spaß beim Experimentieren und Optimieren!

Gruss
Matthias
 
Danke werd ich wohl morgen haben. Wenn ich was geschafft hab und es dich interessiert, werd ich das posten.
 
Moin moin,
Ok aus dem "morgen" des letzten Beitrages sind ein paar tage geworden. Und ich hab auch nicht den Schleifen-Source optimiert:) dafür aber meinen Fehler von ganz oben gefunden und auch den BitBlt-Source verbessert.
Das meine Bilder Schwarz wurden lag daran, das ich sie geladen habe und anschließend im Speicher bearbeitet habe. Sobald die Transparente Farbe "weggerechnet" war hatte sich das Bild optisch verändert und beim nächsten zeichnen war die angegebene Transparente Farbe im Bild nicht mehr vorhanden.... Lösung: einfach einmal zwischen speichern um das Original nicht zu ändern. :)

Hier der Source:
Code:
	CDC dcMemBgr,dcMemSrc,dcMemMask,dcMemSrcCopy;
//Spüeicher erstellen
	dcMemBgr.CreateCompatibleDC(pDc);
	dcMemSrc.CreateCompatibleDC(pDc);
	dcMemMask.CreateCompatibleDC(pDc);
	dcMemSrcCopy.CreateCompatibleDC(pDc);

	CBitmap* oldbgrbmp=NULL;
	CBitmap bgrbmp;
	CBitmap* oldsrcbmp=NULL;
	CBitmap srcbmp;
	CBitmap* oldmaskbmp=NULL;
	CBitmap maskbmp;
	CBitmap *pCBmp = aktMap->GetCBitmap();
	CBitmap *oldsrccopybmp = NULL;

	if(pCBmp)
	{
//Bilddaten ermitteln
		BITMAP *bi = aktMap->GetBitmapInfo();
//Bitmaps anlegen und laden
		oldsrccopybmp = dcMemSrcCopy.SelectObject(pCBmp);
		srcbmp.CreateBitmap(bi->bmWidth, bi->bmHeight, bi->bmPlanes, bi->bmBitsPixel, NULL );
		oldsrcbmp = dcMemSrc.SelectObject(&srcbmp);
		dcMemSrc.BitBlt(0,0,bi->bmWidth, bi->bmHeight,&dcMemSrcCopy,0,0, SRCCOPY);
		dcMemSrcCopy.SelectObject(oldsrccopybmp);
		dcMemSrcCopy.DeleteDC();
		bgrbmp.CreateBitmap(bi->bmWidth, bi->bmHeight, bi->bmPlanes, bi->bmBitsPixel, NULL );
		oldbgrbmp = dcMemBgr.SelectObject(&bgrbmp);
//Hintergrund lesen
		dcMemBgr.StretchBlt(0,0,bi->bmWidth, bi->bmHeight,pDc,Zoom.left,Zoom.top,Zoom.Width(),Zoom.Height(),SRCCOPY);
		// zuerst monochromes (s/w) CBitmap-Objekt in der gleichen
		// Groesse wie eingelesen Bitmap erstellen
		maskbmp.CreateBitmap( bi->bmWidth, bi->bmHeight, 1, 1, NULL );
		// und Masken-Bitmap auswaehlen
		oldmaskbmp = dcMemMask.SelectObject(&maskbmp);//jetzt ist in dc2mask eine einheitliche Fläche in der Grösse des Bitmaps Schwarz uninitialisiert
		// geladene Bitmap in monochrome Bitmap umkopieren
		// -> alles ausser Alphafarbe erscheint nun in schwarzer Farbe
		dcMemMask.BitBlt(0,0,bi->bmWidth, bi->bmHeight,&dcMemSrc,0,0, SRCCOPY );//alles was in dc2 nicht Hintergrund von dc2 entspricht, wird nach dc2mask kopiert, HG von dc2mask ist weiß
		//Maske mit Bgr verknüpfen um Schwarz zumachen, was nachher von Objekt überlagert wird
		dcMemBgr.BitBlt(0,0,bi->bmWidth, bi->bmHeight,&dcMemMask,0,0, SRCAND); 
		// Negativ von S/W Bitmap, HG ist nun schwarz (RGB:0,0,0)
		dcMemMask.BitBlt(0,0,bi->bmWidth, bi->bmHeight,NULL,0,0, DSTINVERT );//maske einfach invertieren daher NULL
		// geladene Bitmap mit negativ von S/W-Bitmap verunden
		// --> HG der geladenen Bitmap ist nun schwarz
		dcMemSrc.BitBlt(0,0,bi->bmWidth, bi->bmHeight,&dcMemMask,0,0, SRCAND );//Alphafarbe ist durch schwarz ersetzt worden bei maske ist alles außer Alphafarbe weiss
		//Src und Bgr verodern 
		dcMemBgr.BitBlt(0,0,bi->bmWidth, bi->bmHeight,&dcMemSrc,0,0, SRCPAINT );
		pDc->StretchBlt(Zoom.left,Zoom.top,Zoom.Width(),Zoom.Height(),&dcMemBgr,Cut.left,Cut.top,Cut.Width(),Cut.Height(),SRCCOPY);//alles was bisher auf dc gezeichnet wurde und die maske -> alles tiefer liegende + "Schatten" von dem was noch kommt	
//aufräumen
		dcMemMask.SelectObject(oldmaskbmp);
		maskbmp.DeleteObject();
		dcMemBgr.SelectObject(oldbgrbmp);
		dcMemSrc.SelectObject(oldsrcbmp);
		bgrbmp.DeleteObject();
	}
	dcMemMask.DeleteDC();
	dcMemSrc.DeleteDC();
	dcMemBgr.DeleteDC();
Vielleicht hilft es ja noch jemandem.

Gruss Michael
 

Neue Beiträge

Zurück