[GELÖST] PNG mit Transparentz erstellen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
DasChris
Beiträge: 4
Registriert: So 3. Mai 2015, 01:41

[GELÖST] PNG mit Transparentz erstellen

Beitrag von DasChris »

Hallo Community,

zusammen mit ein paar Freunden arbeite ich an einem kleinen 2D Spiel. Für unsere Spielwelt benutzen wir das Programm Tiled. Aus Gründen der Performance sollen die Welt in 2 visuelle Ebenen eingeteilt werden: Unter dem Spieler und über dem Spieler.
Nun ist es jedoch so, dass unser Mapper ziemlich viele Ebenen benötigt um genug Details einbauen zu können. Außerdem besteht die Spielewelt aus mehreren Unterbereichen. Um uns das Leben ein wenig einfacher zu machen, werden diese Maps als PNG exportiert und dann zu einem großen Bild verbunden.

Von der Dateigröße her sind aber "normale" Tile-Maps sinvoller. Die Idee war daher, dass wir das große Bild wieder in kleine Einzelteile zerlegen und überschüssige Bereiche herausnehmen.
In einem Proof-Of-Concept zum Thema Analyse stellte sich heraus, dass diese Idee grundsätzlich funktioniert. Es scheitert jedoch an einem Punkt: Die Transparentz geht "kaputt".

Um zu prüfen, ob ich vielleicht etwas übersehen habe, habe ich folgenden erstellt:

Code: Alles auswählen

 
var
  Test : TPortableNetworkGraphic;
  X, Y : Cardinal;
  lColor : TFPColor;
begin
  Test := TPortableNetworkGraphic.Create;
  Test.LoadFromFile('C:\mytest123.png');
  Test.PixelFormat := pf32Bit;
  for Y := 0 to 255 do
  begin
    for X := 0 to 255 do
    begin
      lColor := Test.Canvas.Colors[X, Y];
      if lColor.alpha > 0 then
      begin
        lColor.red := $FFFF;
      end;
      Test.Canvas.Colors[X, Y] := lColor;
    end;
  end;
  Test.SaveToFile('C:\mytest123_2.png');
  Test.Free;
end;
 
Dieser Schnippsel lädt ein 256x256 Bild mit einem schwarzen Kreis. Die Transparentz ist dabei recht fließend. Es sucht nach Werten, die nicht völlig transparent sind und färbt diese rot.
Das klappt auch. Nur das im Endergebnis die fließende Transparent völlig verschwindet und nur noch ein "Solide/Transparent" Mix ensteht.
Hier mal ein Vorher und Nachher der Bilder.
Dateianhänge
Nachher
Nachher
mytest123_2.png (1.83 KiB) 934 mal betrachtet
Vorher
Vorher
mytest123.png (5.98 KiB) 934 mal betrachtet
Zuletzt geändert von DasChris am So 3. Mai 2015, 13:17, insgesamt 1-mal geändert.

DasChris
Beiträge: 4
Registriert: So 3. Mai 2015, 01:41

Re: PNG mit Transparentz erstellen

Beitrag von DasChris »

Ich hasse sowas. Kaum hab ich es geposted und mit jemanden darüber geredet, kommen wir der Lösung in wenigen Minuten auf die Schliche.
Daher für alle, die das gleiche Problem haben wie ich:

Man muss zusätzlich ein TLazIntfImage (Unit: IntfGraphics) erstellen und das Bild in dieses "hinein laden". Das steht zwar auch im Wiki ( http://wiki.freepascal.org/Developing_w ... zIntfImage ), jedoch geht es immer um TBitMap. Und auch die Methode "LoadFromBitmap" scheint eine BitMap zu erwarten.
Tatsächlich aber können auch PNGs verwendet werden.
Damit die Transparentz erhalten bleibt, muss man das Bild nach Bearbeitung wieder "zurück" schicken.

Hier das nun funktionierende Beispiel:

Code: Alles auswählen

 
var
  Test : TPortableNetworkGraphic;
  X, Y : Cardinal;
  lColor : TFPColor;
  Test2  : TLazIntfImage;
begin
  Test := TPortableNetworkGraphic.Create;
  Test2 := TLazIntfImage.Create(0,0);
 
  Test.LoadFromFile('C:\mytest123.png');
  Test2.LoadFromBitmap(Test.Handle, Test.MaskHandle);
  for Y := 0 to 255 do
  begin
    for X := 0 to 255 do
    begin
      lColor := Test2.Colors[X, Y];
      if lColor.alpha > 0 then
      begin
        lColor.red := $FFFF;
      end;
      Test2.Colors[X, Y] := lColor;
    end;
  end;
  Test.LoadFromIntfImage(Test2);
  Test.SaveToFile('C:\mytest123_2.png');
  Test2.Free;
  Test.Free;
end;
 
Und ja, da gehören eigentlich noch try...finally Blöcke rein. Die habe ich zum schnellen Testen jedoch weggelassen.
Zum Beweis das nun korrekte Bild:
Dateianhänge
mytest123_2.png
mytest123_2.png (5.35 KiB) 932 mal betrachtet

Antworten