AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Zwei Transparente PNGs kombinieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zwei Transparente PNGs kombinieren

Ein Thema von ddcool · begonnen am 29. Aug 2011 · letzter Beitrag vom 31. Aug 2011
Antwort Antwort
ddcool

Registriert seit: 8. Jun 2003
146 Beiträge
 
Delphi XE2 Architect
 
#1

Zwei Transparente PNGs kombinieren

  Alt 29. Aug 2011, 12:03
Hallo liebe DPler,

ich möchte gerne zwei PNGs, die beide transparente Bereiche enthalten miteinander kombinieren, so dass die Transparenz der beiden Bilder nicht addiert wird. Im Anhang ein Beispiel, welches genau das Problem aufzeigt. Der untere schwarze Kasten und der Verlaufeffekt sind das erste Bild, welches als Hintergrund benutzt wird. der obere Kasten ist das Bild, welches auf den Hintergrund gezeichnet wird.
Dazu benutzte ich folgende Methode:

Code:
  TestImage := TPngImage.Create;
  TestImage.Assign(TPngImage(imgBackground.Picture.Graphic));
  TestImage.Canvas.Draw(20, 30, ImageList.ButtonImage);
  ...
  TPngImage(imgBackground.Picture.Graphic).Assign(TestImage);
(ImageList.ButtonImage ist vom Typ TPngImage und wird zuvor mit einem PNG befüllt)

Eigentlich ist der obere Kasten (ButtonImage) eine gleichbleibend halb transparente schwarze Box, jedoch wird die Transparenz des Hintergrundes addiert, sodass das ButtonImage mit verblasst.

Gibt es eine Möglichkeit das zu verhindern, bzw das ButtonImage auf dem Hintergrund anders zu Zeichnen, sodass die korrekte Transparenz bestehen bleibt?

In diesem Thread wird das ganze ansatzweise besprochen, jedoch möchte ich nicht jeden Pixel umrechnen müssen.

Danke für jede Hilfe!


Lieben Gruß,

ddcool
Angehängte Grafiken
Dateityp: jpg test.jpg (1,2 KB, 32x aufgerufen)

Geändert von ddcool (29. Aug 2011 um 13:05 Uhr)
  Mit Zitat antworten Zitat
ddcool

Registriert seit: 8. Jun 2003
146 Beiträge
 
Delphi XE2 Architect
 
#2

AW: Zwei Transparente PNGs kombinieren

  Alt 30. Aug 2011, 12:47
Nach langem Suchen haben ich folgenden Quelltext gefunden, der genau das macht was ich will.

Code:
procedure DrawPngWithAlpha(Src, Dest: TPngImage; const R: TRect);
var
  X, Y: Integer;
  Alpha: PByte;
begin
  Src.Draw(Dest.Canvas, R);

  for Y := R.Top to R.Bottom - 1 do
    for X := R.Left to R.Right - 1 do
    begin
      Alpha := @Dest.AlphaScanline[Y]^[X];
      Alpha^ := Min(255, Alpha^ + Src.AlphaScanline[Y - R.Top]^[X - R.Left]);
    end;
end;
Allerdings ist der Quelltext sehr unperformant, da ich ja sehr häufig die Form neu zeichnen lasse, da ich die gesamte Form mittels UpdateLayeredWindow zeichne.
Gibt es da alternativen, oder ist meine Herangehensweise eventuell falsch?

Ich habe ein TImage-Object auf welches dann aus Bildresourcen die Form zusammengesetzt wird. Das realisiere ich erstmalig mit Assign, um den Hintergrund zuzuweisen und alles weitere kommt dann mit Draw, oder oben genannter Funktion auf das TImage.
Dann benutze ich TJvTransparentForm mit dem TImage als Layer, um meine Form mit dem gewünschten Design auszustatten. Jedoch will ich, dass sich die Form alle paar Millisekunden neu Zeichnet, da sich das TImage ja auch verändern kann (Laufschrift, etc.).

Macht man das so, oder benutzt man da lieber ein OnPaint-Ereignis? Momentan liegt die CPU-Auslastung bei ca 10-15%, was meiner Meinung nach zu viel ist.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zwei Transparente PNGs kombinieren

  Alt 30. Aug 2011, 13:07
Zitat:
da sich das TImage ja auch verändern kann
Ständig neu Zeichen, da sich eventuell etwas ändern könnte?
Zeichne doch nur neu, wenn sich wirklich was ändert und womöglich dann auch nur diesen Teil.

TImage ist eigentlich nicht gut geeignet, für schnelle veränderungen, da es recht langsam ist.
Könnte man stattdessen auch etwas Anderes nehmen, zusammen mit einem Offscreenbitmap? (eventuell TPaintBox oder direkt das Canvas der Form)


Ich weiß ja nicht was AlphaScanline so alles macht, aber es wäre bestimmt besser, wenn das nicht für jedes X abgerufen würde ... einmal pro Y reicht doch auch aus.

Delphi-Quellcode:
for Y := R.Top to R.Bottom - 1 do
  DestAlpha := Dest.AlphaScanline[Y];
  SrcAlpha := Src.AlphaScanline[Y - R.Top];
  for X := R.Left to R.Right - 1 do
    DestAlpha[X] := Min(255, DestAlpha[X] + SrcAlpha[X - R.Left]);
end;
$2B or not $2B

Geändert von himitsu (30. Aug 2011 um 13:12 Uhr)
  Mit Zitat antworten Zitat
ddcool

Registriert seit: 8. Jun 2003
146 Beiträge
 
Delphi XE2 Architect
 
#4

AW: Zwei Transparente PNGs kombinieren

  Alt 30. Aug 2011, 15:56
Danke himitsu,

deine Methode klappt merklich schneller, was ja auch nicht verwunderlich ist.
Problem dabei ist leider nur, wenn ich einen Farbverlauf als Hintergrund habe, der von links nach rechts Transparent wird, greift das ganze nicht mehr so wie es soll...

Gibt es eine alternative Möglichkeit, zwei PNGs mit unterschiedlichen Transparenzen mit einander zu Kombinieren und die Transparenzen so zu verrechnen, dass beide Bilder trotzdem wie original aussehen?

Im Prinzip so als würde ich in Photoshop zwei Ebenen erstellen und jeweils ein PNG auf jede Ebene legen.

Vielen Dank & Gruß

Geändert von ddcool (30. Aug 2011 um 16:08 Uhr)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#5

AW: Zwei Transparente PNGs kombinieren

  Alt 30. Aug 2011, 16:36
Eigentlich müßte sowas mit http://graphics32.org funktionieren.
  Mit Zitat antworten Zitat
schlagzu

Registriert seit: 11. Okt 2010
86 Beiträge
 
Delphi XE Starter
 
#6

AW: Zwei Transparente PNGs kombinieren

  Alt 30. Aug 2011, 16:38
Ich kann nur graphics32 empfehlen. Mir der kann man alles mit verschiedenen Modi kombinieren, übermalen, drehen etc. Einfach mal in der Doku nachsehen.
  Mit Zitat antworten Zitat
schlagzu

Registriert seit: 11. Okt 2010
86 Beiträge
 
Delphi XE Starter
 
#7

AW: Zwei Transparente PNGs kombinieren

  Alt 30. Aug 2011, 16:38
verdammt ich war zu langsam
  Mit Zitat antworten Zitat
ddcool

Registriert seit: 8. Jun 2003
146 Beiträge
 
Delphi XE2 Architect
 
#8

AW: Zwei Transparente PNGs kombinieren

  Alt 31. Aug 2011, 10:06
Vielen Dank für den Tipp

Muss ich mich dann mal reinarbeiten, aber andere Frage zu dem ganzen Thema:

Ist es eigentlich noch zeitgemäß diesen Weg zu gehen, um eine Applikation mit seinem individuellen Design auszustatten (sprich eigene PNGs)? Oder ist dafür einfach eine andere Methode empfehlenswert?
Habe mal was von Direct2D oder OpenGL Empfehlungen gelesen, aber die Frage ist, ob man damit auch so schöne halbtransparente Formulare hin bekommt...

Im Anhang das Design, welches ich umsetzen möchte (ohne den Holzhintergrund versteht sich).
Miniaturansicht angehängter Grafiken
player_vorschau.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Zwei Transparente PNGs kombinieren

  Alt 31. Aug 2011, 11:00
Ich kann nur GDI+ empfehlen schlank und schnell
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#10

AW: Zwei Transparente PNGs kombinieren

  Alt 31. Aug 2011, 12:16
Zitat:
Habe mal was von Direct2D oder OpenGL Empfehlungen gelesen, aber die Frage ist, ob man damit auch so schöne halbtransparente Formulare hin bekommt...
Das bekommt man mit OpenGL ganz sicher hin. OpenGL ist aber sehr mächtig und man braucht etwas, um sicher dort einzuarbeiten. Je flexibler und größer Deine Grafikaufgaben sind, desto mehr ist OpenGL zu empfehlen http://www.delphigl.com/. Für einfache Sachen würde ich aber Graphics32 mit GR32_lines http://angusj.com/delphi/gr32_lines.php anraten

Geändert von Jens01 (31. Aug 2011 um 12:22 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:51 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