![]() |
Denkfehler bei TransparentStretchBlt
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo miteinander,
irgendwie ist nach dem Jahreswechsel der Denkapparat noch nicht ganz auf Hochtouren. Es geht um folgende selbstgeschriebende Prozedur:
Delphi-Quellcode:
Destination ist in meinen Beispiel einfach ein rotes Bitmap und Source ein sehr viel kleineres schachbrettartiges Muster in Schwarz/Weiss.
procedure TransparentStretch(const Source, Destination : TBitmap);
var TmpBmp : TBitmap; begin TmpBmp := TBitmap.Create; try TmpBmp.Width := Destination.Width; TmpBmp.Height := Destination.Height; SetStretchBltMode(TmpBmp.Canvas.Handle, HALFTONE); if TransparentStretchBlt( TmpBmp.Canvas.Handle, 0, 0, TmpBmp.Width, TmpBmp.Height, Source.Canvas.Handle, 0, 0, Source.Width, Source.Height, Source.Canvas.Handle, 0, 0) then begin Destination.Assign(TmpBmp); end; finally TmpBmp.Free; end; end; Nun hätte ich gern, das am Ende ein roter Hintergrund mit schwarzen Kästchen rauskommt. Leider sorgt das Aufrufen der Funktion nur für ein Umschalten und stretchen des Schachbrett-Musters, also als hätte man StretchBlt angewendet. Ideen, Vorschläge, (Teil-)Lösungen? |
AW: Denkfehler bei TransparentStretchBlt
Irgendwie wird Destination bei Deiner Routine ja überhaupt nicht berücksichtigt. Bringt es etwas, wenn Du TmpBMP zunächst Destination zuweist (Assign)?
|
AW: Denkfehler bei TransparentStretchBlt
Zitat:
Jetzt tuts endlich! Man sollte einfach öfter hier fragen, anstatt stundenlang rumzufrickeln! :oops: Eine Verständnisfrage habe ich noch: Warum muss man eigentlich den Umweg über eine temporäre Bitmap nehmen? Das es so funktioniert ist klar, aber irgendwie will mir nicht einleuchten, warum man das nicht auf der orginal Bitmap machen kann. Irgendwie findet man auch selten gute Anleitungen, Beschreibungen und Tutorials zu diesen ganzen Bitmap- und Blitten-Mist! |
AW: Denkfehler bei TransparentStretchBlt
Da die Methode so "prima" dokumentiert ist, kann ich auch nur raten: versuch doch einmal, die temporäre Bitmap ganz wegzulassen und stattdessen Destination zu übergeben. Zumindest sehe ich keinen Grund, wieso das nicht funktionieren sollte, daher ist es einen Versuch wert IMO.
|
AW: Denkfehler bei TransparentStretchBlt
Jo, es geht auch ohne, aber man muss das Ziel-Bitmap sich am Ende selbst Assignen lassen...logisch erklären kann ich es aber nicht.
Für alle die das mal mit der SuFu finden werden, hier noch meine letztendliche Lösung:
Delphi-Quellcode:
procedure TransparentStretch(const Mask, Destination : TBitmap);
begin SetStretchBltMode(Destination.Canvas.Handle, HALFTONE); if TransparentStretchBlt( Destination.Canvas.Handle, 0, 0, Destination.Width, Destination.Height, Mask.Canvas.Handle, 0, 0, Mask.Width, Mask.Height, Mask.Canvas.Handle, 0, 0 ) then begin Destination.Assign(Destination); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz