AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Denkfehler bei TransparentStretchBlt
Thema durchsuchen
Ansicht
Themen-Optionen

Denkfehler bei TransparentStretchBlt

Ein Thema von TiGü · begonnen am 2. Jan 2012 · letzter Beitrag vom 3. Jan 2012
Antwort Antwort
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#1

Denkfehler bei TransparentStretchBlt

  Alt 2. Jan 2012, 15:08
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?
Angehängte Grafiken
Dateityp: jpg Hintergrund.jpg (2,6 KB, 10x aufgerufen)
Dateityp: bmp Mask.Bmp (6,2 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Denkfehler bei TransparentStretchBlt

  Alt 2. Jan 2012, 15:46
Irgendwie wird Destination bei Deiner Routine ja überhaupt nicht berücksichtigt. Bringt es etwas, wenn Du TmpBMP zunächst Destination zuweist (Assign)?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Denkfehler bei TransparentStretchBlt

  Alt 2. Jan 2012, 15:55
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!
Jetzt tuts endlich!
Man sollte einfach öfter hier fragen, anstatt stundenlang rumzufrickeln!

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!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Denkfehler bei TransparentStretchBlt

  Alt 2. Jan 2012, 16:00
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Denkfehler bei TransparentStretchBlt

  Alt 3. Jan 2012, 08:37
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;

Geändert von TiGü ( 3. Jan 2012 um 08:39 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:58 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