Einzelnen Beitrag anzeigen

Benutzerbild von Hepdepaddel
Hepdepaddel

Registriert seit: 12. Dez 2005
Ort: Bremen
91 Beiträge
 
Delphi 2006 Enterprise
 
#1

TBitmap.Canvas.Draw erzeugt "ein Loch"

  Alt 16. Mai 2020, 11:42
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;
  Mit Zitat antworten Zitat