AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

JPG oder PNG mit transparenten Bereichen zeichnen

Ein Thema von posbi · begonnen am 19. Aug 2018 · letzter Beitrag vom 23. Aug 2018
Antwort Antwort
posbi
(Gast)

n/a Beiträge
 
#1

JPG oder PNG mit transparenten Bereichen zeichnen

  Alt 19. Aug 2018, 10:03
Hallo,

ich habe folgendes Problem, bei dem ich nicht weiter komme.

Ich habe Delphi 10.2.3 Enterprise. Die Anwendung ist eine FMX Anwendung.

Ich habe ein Bild als JPG, BMP (oder auch PNG) Datei in der es Bereiche gibt die Transparent sein sollen. Zur Laufzeit sollen diese transparenten Bereiche (Kreise und Rechtecke) dann mit Farben gefüllt werden. Alle transparente Bereiche sollen dabei die gleiche Farbe erhalten, so das im Prinzip der Hintergrund auf den das Bild gezeichnet wird einfarbig sein kann und nur die bestimmten Bereiche durchsichtig sein müssen, damit der Hintergrund durchscheint.

Ich habe jetzt schon ewig gesucht, aber nichts wirklich passendes gefunden. Hat jemand eine Idee wie man so etwas umsetzt? Oder einen Link wo so etwas schon mal gemacht oder beantwortet wurde?

Viele Grüße
  Mit Zitat antworten Zitat
Redeemer

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

AW: JPG oder PNG mit transparenten Bereichen zeichnen

  Alt 19. Aug 2018, 14:49
Bei JPG geht es nicht, Transparenz mit BMP ist auch nicht standartisiert. Der Standard sagt: 32-Bit-Bitmaps sind Bitmaps, bei denen das 4. Byte ausschließlich der Platzverschwendung dient.

PNG kann Transparenz:
Delphi-Quellcode:
  PNG := TPNGImage.Create();
  try
    PNG.LoadFromFile(bla);
    PNG2 := TPNGImage.CreateBlank(PNG.Width, PNG.Height, COLOR_RGB, 8);
    try
      PNG2.Canvas.Brush.Color := clIrgendwas;
      PNG2.Canvas.FillRect(Rect(0,0,PNG.Width,PNG.Height));
      PNG2.Canvas.Draw(0,0, PNG);
      PNG2.TueDinge();
    finally
      PNG2.Free();
    end;
  finally
    PNG.Free();
  end;
Janni
2005 PE, 2009 PA, XE2 PA

Geändert von Redeemer (19. Aug 2018 um 15:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

AW: JPG oder PNG mit transparenten Bereichen zeichnen

  Alt 19. Aug 2018, 15:05
Ich habe es neulich schon gepostet, vielleicht hilft Dir das hier weiter? https://parnassus.co/open-source/ttransparentcanvas/
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
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: JPG oder PNG mit transparenten Bereichen zeichnen

  Alt 19. Aug 2018, 15:38
Bei Bildformaten die keine eigenen Alphachannels besitzen bedient man sich oftmals eines kleinen Tricks, man wertet Farbe bei Pixel 0,0 aus und setzt diese als Transparenz-Farbe. Ob man das generell so handhaben kann da bin ich überfragt.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: JPG oder PNG mit transparenten Bereichen zeichnen

  Alt 19. Aug 2018, 17:08
Hallo,

ich habe folgendes Problem, bei dem ich nicht weiter komme.

Ich habe Delphi 10.2.3 Enterprise. Die Anwendung ist eine FMX Anwendung.

Ich habe ein Bild als JPG, BMP (oder auch PNG) Datei in der es Bereiche gibt die Transparent sein sollen. Zur Laufzeit sollen diese transparenten Bereiche (Kreise und Rechtecke) dann mit Farben gefüllt werden. Alle transparente Bereiche sollen dabei die gleiche Farbe erhalten, so das im Prinzip der Hintergrund auf den das Bild gezeichnet wird einfarbig sein kann und nur die bestimmten Bereiche durchsichtig sein müssen, damit der Hintergrund durchscheint.

Ich habe jetzt schon ewig gesucht, aber nichts wirklich passendes gefunden. Hat jemand eine Idee wie man so etwas umsetzt? Oder einen Link wo so etwas schon mal gemacht oder beantwortet wurde?

Viele Grüße
Wie die anderen schon erwähnt haben, kann eine JPeg-Datei keine transparenten Bereiche haben (eine 32-Bit-Bitmap unter Windows schon, diese wirst Du aber nicht in FMX einlesen können).

Als Quelle müsstest Du also schon .PNG-Dateien verwenden, die Du dann wie beschrieben modifizieren kannst.

Du müsstest also die einzelnen Pixel prüfen und bei den transparenten Pixeln den alpha-Wert auf Null setzen und die anderen RGB-Werte mit der gewünschten Farbe setzen.

Unter FMX greifst Du da per "TBitmap.map" und "TBitmapData.GetPixel" bzw. "TBitmapData.SetPixel" lesend und schreibend auf die einzelnen Pixel zu.

Bei Bedarf: In meinem letzten FMX-Buch ist im Kapitel 6 ("Grafikbearbeitung mit FireMonkey") unter Punkt 3. ein Beispiel mit Source-Code beschrieben, wie man den Alpha-Wert eines TBitmaps verändern kann (unter Punkt 2., wie man Farben setzt).
  Mit Zitat antworten Zitat
posbi
(Gast)

n/a Beiträge
 
#6

AW: JPG oder PNG mit transparenten Bereichen zeichnen

  Alt 23. Aug 2018, 10:37
Hallo,

vielen Dank für eure vielen Antworten. Grundsätzlich habe ich es nun hinbekommen. Im Moment kämpfe ich noch mit den unterschiedlichen Skalierungen und Auflösungen bei verschiedenen Devices.
Ich denke wahrscheinlich immer noch zu in "VCL"

Aber dazu stelle ich gleich eine neue Frage.

Gruß Frank
  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 23:53 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