AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia TBitmap.Canvas.Draw erzeugt "ein Loch"

TBitmap.Canvas.Draw erzeugt "ein Loch"

Ein Thema von Hepdepaddel · begonnen am 16. Mai 2020 · letzter Beitrag vom 20. Mai 2020
Antwort Antwort
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, 10: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
mytbo

Registriert seit: 8. Jan 2007
26 Beiträge
 
#2

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

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

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
651 Beiträge
 
Delphi 2009 Professional
 
#3

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

  Alt 16. Mai 2020, 13:36
[DELPHI] Bitmap.Canvas.Draw(50, 50, Stamp, 100); // Funktioniert auch ohne Opacity-Angabe nicht
Warum 50 und nicht 0?
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Hepdepaddel
Hepdepaddel

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

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

  Alt 16. Mai 2020, 17:41
[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.
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
88 Beiträge
 
#5

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

  Alt 16. Mai 2020, 20:46
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

Geändert von venice2 (16. Mai 2020 um 20:50 Uhr)
  Mit Zitat antworten Zitat
Gyrospeter

Registriert seit: 11. Apr 2019
36 Beiträge
 
Delphi XE2 Professional
 
#6

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

  Alt 20. Mai 2020, 13:18
Verwendest du als Source Bitmap 32 oder 24 bit?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf