Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   TBitmap.Canvas.Draw erzeugt "ein Loch" (https://www.delphipraxis.net/204298-tbitmap-canvas-draw-erzeugt-ein-loch.html)

Hepdepaddel 16. Mai 2020 10:42

TBitmap.Canvas.Draw erzeugt "ein Loch"
 
Hallo, zusammen,

eigentlich dachte ich, hätte ich eine ganz einfache Sache vor: Ich möchte auf eine bestehende Grafik ein leicht transparentes Polygon zeichnen.

Die Grafik liegt als TPNGImage vor und wurde bereits aus einer Datei geladen. Weil ich keinen Weg gefunden habe, einfach ein halbtransparentes Objekt zu zeichnen, die Methode Draw aber offenbar Transparenz unterstützt, wollte ich wie folgt vorgehen:
  • Übertragen des Bilds aus IMG in einen Hintergrund ("Bitmap") und einen Vordergrund ("Stamp")
  • Zeichnen des Polygons auf dem Vordergrund ("Stamp")
  • Zeichnen des Vordergrunds auf den Hintergrund mit Transparenz über die Methode Draw.

Der Code zeichnet vereinfachend ein Rechteck, später müssen auch Polygone gezeichnet werden, daher kann ich die Bitmap nicht einfach genauso groß wie das Rechteck machen. Bei einem Polygon bleibt auf der Bitmap weiße Fläche an den Rändern, die dann beim Übertragen auf den Hintergrund stört. Daher der Ansatz, den Vordergrund exakt mit dem Hintergrund zu füllen, transparenzlos darauf zu zeichnen und dann den Vordergrund mit Transparenz auf den Hintergrund zu legen. Wo gleicher Inhalt ist, stört das ja nicht.

(Die Idee stammt aus https://stackoverflow.com/questions/...314494_4917296).

Das funktioniert fast. Als Ergebnis erhalte ich aber nicht ein rotes Rechteck, sondern der Bereich des Rechtecks wird "ausgestanzt", da sehe ich genau den Hintergrund. Um den Effekt zu erkennen, habe ich den Vordergrund (Stamp) um 50px verschoben auf das Bitmap gelegt, dann sieht man sehr schön, wie das Bild leicht transparent gegen den Hintergrund verschoben dargestellt wird, aber genau an der Stelle des roten Rechtecks der Hintergrund klar durchscheint.

Testweise habe ich auch einfach mal den Hintergrund direkt durch den Vordergrund ersetzt (auskommentiert: Bitmap.Assign(Stamp)). Dann ist alles OK und das rote Rechteck erscheint. Das Zeichnen des Rechtecks sieht also OK aus, beim Übertragen per DRAW wird es aber irgendwie als "volltransparenter Bereich" interpretiert.

Ich bin nicht wirklich fit in Alphatransparenzen und allen dafür möglichen Einstellungen an den verschiedensten Orten... woran kann das liegen?


Delphi-Quellcode:
  procedure cmd_POLYGON(Line: String);
  var
    Bitmap, Stamp: TBitmap;
  begin
    if (IMG=NIL) then Exit;

    // Hintergund und Überblendfläche mit Ursprungsbild füllen
    Bitmap:=TBitmap.Create;
    Bitmap.Assign(IMG);
    Stamp:=TBitmap.Create;
    Stamp.Assign(IMG);

    // Zeichnen
    Stamp.Canvas.Brush.Color:=clRed;
    Stamp.Canvas.Rectangle(100,100,300,200);

    // Bild auf den Hintergrund übertragen
    Bitmap.Canvas.Draw(50, 50, Stamp, 100); // Funktioniert auch ohne Opacity-Angabe nicht
//  Bitmap.Assign(Stamp); // - Testvariante, um Rechteck-Zeichnung zu prüfen, scheint OK


    // Gesamtbild wieder dem Ursprungsbild zuweisen
    IMG.Assign(Bitmap);

    Bitmap.Free;
    Stamp.Free;
  end;

mytbo 16. Mai 2020 11:21

AW: TBitmap.Canvas.Draw erzeugt "ein Loch"
 
Ich halte in meinen Programmen die Anzahl der Fremdkomponenten sehr klein. Wenn ich mir aber deine Einführung durchlese, beschleicht mich das Gefühl, dass da noch mehr Grafikfunktionen dazukommen könnten. Wenn das der Fall ist, verwende lieber gleich eine vollständige Library. Empfehlen kann ich:
http://www.angusj.com/delphi/image32/Docs/_Body.htm

Bis bald...
Thomas

Redeemer 16. Mai 2020 13:36

AW: TBitmap.Canvas.Draw erzeugt "ein Loch"
 
Zitat:

Zitat von Hepdepaddel (Beitrag 1464671)
[DELPHI] Bitmap.Canvas.Draw(50, 50, Stamp, 100); // Funktioniert auch ohne Opacity-Angabe nicht

Warum 50 und nicht 0?

Hepdepaddel 16. Mai 2020 17:41

AW: TBitmap.Canvas.Draw erzeugt "ein Loch"
 
Zitat:

Zitat von Redeemer (Beitrag 1464679)
Zitat:

Zitat von Hepdepaddel (Beitrag 1464671)
[DELPHI] Bitmap.Canvas.Draw(50, 50, Stamp, 100); // Funktioniert auch ohne Opacity-Angabe nicht

Warum 50 und nicht 0?

Zu Testzwecken. Um den Effekt zu erkennen, habe ich den Vordergrund (Stamp) um 50px verschoben auf das Bitmap gelegt, dann sieht man sehr schön, wie das Bild leicht transparent gegen den Hintergrund verschoben dargestellt wird, aber genau an der Stelle des roten Rechtecks der Hintergrund klar durchscheint.

Würde ich Draw auf 0/0 machen, würde man nur merken, dass aus irgendeinem Grund kein Rechteck da ist. Das könnte auch daran liegen, dass das Vordergrund-Bild gar nicht eingefügt wird. So aber sieht man, dass das restliche Bild um 50px versetzt leicht transparent über den Hintergrund gelegt wird und lediglich an der Stelle des Rechtecks eine "Aussparung" ist, hinter der das Originalbild ohne jede Überlagerung zu sehen ist.

venice2 16. Mai 2020 20:46

AW: TBitmap.Canvas.Draw erzeugt "ein Loch"
 
Im Normalfall ist der Hintergrund eines TBitmap schwarz.
Und schwarz ist bei einem PNG nun mal die transparente Farbe versuche doch mal mit FillRect das TBitmap vorher mit einer anderen Farbe zu befüllen.
Wenn du also auf ein PNG Image die Farbe schwarz anwendest wird dieser Bereich halt durchsichtig (ohne Angabe des Alpha Channel)

Bsp: $FF00FF

Gyrospeter 20. Mai 2020 13:18

AW: TBitmap.Canvas.Draw erzeugt "ein Loch"
 
Verwendest du als Source Bitmap 32 oder 24 bit?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:59 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