Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Denkfehler bei TransparentStretchBlt (https://www.delphipraxis.net/165484-denkfehler-bei-transparentstretchblt.html)

TiGü 2. Jan 2012 15:08


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:
  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;
Destination ist in meinen Beispiel einfach ein rotes Bitmap und Source ein sehr viel kleineres schachbrettartiges Muster in Schwarz/Weiss.
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?

DeddyH 2. Jan 2012 15:46

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)?

TiGü 2. Jan 2012 15:55

AW: Denkfehler bei TransparentStretchBlt
 
Zitat:

Zitat von DeddyH (Beitrag 1144025)
Irgendwie wird Destination bei Deiner Routine ja überhaupt nicht berücksichtigt. Bringt es etwas, wenn Du TmpBMP zunächst Destination zuweist (Assign)?

Juchu, Danke, vielen vielen Dank! :-D
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!

DeddyH 2. Jan 2012 16:00

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.

TiGü 3. Jan 2012 08:37

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 03:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz