AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Einmal im Leben ein "richtiges" PNG-Bild erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Einmal im Leben ein "richtiges" PNG-Bild erstellen

Ein Thema von geesmith · begonnen am 11. Dez 2016 · letzter Beitrag vom 13. Dez 2016
Antwort Antwort
geesmith

Registriert seit: 17. Jan 2003
Ort: Frauenfeld
32 Beiträge
 
Delphi XE5 Architect
 
#1

Einmal im Leben ein "richtiges" PNG-Bild erstellen

  Alt 11. Dez 2016, 20:44
Hi zusammen

Über PNG und dergleichen lässt sich ja so richtig viel finden. Auch hier im Forum wurde schon viel darüber geschrieben. Eines konnte ich jedoch nie klären und aus aktuellem Projektanlass beschäftigt es mich nun wieder. Ich bin kein Grafikexperte, daher seid etwas nachsichtig .

Es geht darum, ein PNG-File mit Transparenz zu speichern. Das funktioniert ganz gut (bmp.TransparentColor, bmp.TransparentMode, bmp.Transparent). Ich habe in meinem Delphi-Beispiel ein Bild mit TransparentColor = clWhite gespeichert. Laden und mit Draw in ein bestehendes Bild zeichnen kann ich mein Transparentes PNG ebenso.

Aber wenn ich mein PNG-File mit Photoshop über ein anderes Bild legen will, dann habe ich Probleme. Ich zeige im angehängten Screenshot in Photoshop den Vergleich zu einem "richtigen" PNG-File. Das "Richtige" (die Bombe) wird mit dem Transparenz-Muster und in der Ebenenübersicht als "Ebene" angezeigt. Mein gespeichertes PNG-File wird mit der Farbe Weiss im Hintergrund und in der Ebenenübersicht als "Hintergrund" angezeigt. Also irgendwas ist da anders.

Was als Folge davon auch mühsam ist, dass wenn ich so ein "falsches" PNG in Delphi lade und mit Draw irgendwo hinzeiche, ich die jeweilige "Transparenzfarbe" dem Image fix angeben muss. Bei dem "richtigen PNG kann ich das Ding einfach laden und reinzeichnen und fertig.

Daher meine Frage.. wie kriege ich so ein "richties" PNG-File in Delphi hin?

Meine Darstellung und Beschreibung habe ich bewusst etwas naiv erscheinen lassen.

Vielen Dank für eure Hilfe
Gee
Miniaturansicht angehängter Grafiken
bild-1.jpg  

Geändert von geesmith (11. Dez 2016 um 21:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Einmal im Leben ein "richtiges" PNG-Bild erstellen

  Alt 11. Dez 2016, 21:08
Du musst ein PNGImage benutzen. Das hat glaube ich irgendwas wie Transparenz-Scanline oder sowas.
Damit kann man die Transparenz richtig setzen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Einmal im Leben ein "richtiges" PNG-Bild erstellen

  Alt 11. Dez 2016, 21:41
Habe mal meine Unit angehängt, die ich lange Zeit verwendet habe, um PNGs zu laden und zu speichern (benötigt Graphics32). Die ursprüngliche Version des Quelltextes hatte ich mal irgendwo gefunden (weiß leider nicht mehr wo) und dann über die Jahre etwas erweitert und ein paar Bugs gefixt und Freepascal-Support hinzugefügt. Disclaimer: Ich habe immer alles nur soweit implementiert wie ich es selber brauchte. Deshalb keine Garantie auf Korrektheit oder Vollständigkeit.

Es scheint inzwischen aber auch neuere Versionen (Forks?) der ursprünglichen Unit zu geben, die anscheinend mehr können als meine, z.B. hier. Ich hoffe mal, die funktionieren auch korrekt. Ich weiß nur noch, dass die ursprüngliche Version bei manchen Dateien irgendein Problem mit dem Alphakanal hatte, was sich darin äußerte, dass die Ränder immer etwas "ausgefranst" waren, was sich beim mehrfachen Lesen und Speichern glaube ich auch noch verschlimmerte. Das habe ich dann irgendwann mal gefixt. Ich hoffe ich habe die richtige Version erwischt, die den Fix auch enthält.
Angehängte Dateien
Dateityp: pas GR32_PNG.pas (7,7 KB, 26x aufgerufen)

Geändert von Namenloser (11. Dez 2016 um 21:49 Uhr)
  Mit Zitat antworten Zitat
geesmith

Registriert seit: 17. Jan 2003
Ort: Frauenfeld
32 Beiträge
 
Delphi XE5 Architect
 
#4

AW: Einmal im Leben ein "richtiges" PNG-Bild erstellen

  Alt 13. Dez 2016, 09:23
Danke für euren Input.

Ich habe beide Anregungen verfolgt und versucht ein Beispiel zu generieren.

Leider ohne Erfolg. Das mit der Transparenz-Scanline hat mich nicht weitergebracht. Hast du ein Beispiel?

Da ich mit Berlin-Standard arbeite, hat mich das GR32-Beispiel schlussendlich nicht weiter gebracht. Zwar gab es hier vielversprechende Ansätze wie "Header.ColorType" etc, aber das erzeugt Fehlermeldungen. PixelPtr gibt es bei TBitmap auch nicht. Ich konnte hier leider kein lauffähiges Beispiel mit Standard-Delphi Komponenten erzeugen.

Fazit... ich kann weiterhin nur PNG-Dateien erzeugen welche sich gleich wie im meinem Screenshot oben verhalten. Was vielleicht noch spannend ist, dass Gimp in meinem erzeugten PNGFile die Transparenzfläche anzeigen kann. Nur Photoshop zeigt das anders an. Also die PNG ist irgendwie doch anders als eine PNG-Datei wie ich sie von irgendwoher downloaden kann.

Das ist nach wie vor meine einzige lauffähige Möglichkeit ein PNG zu erstellen. Hat noch jemand ein anderes Beispiel?
Code:
procedure TForm1.Button1Click(Sender: TObject);
var png:TPngObject;
  bmp:TBitmap;
begin
  bmp := TBitmap.Create;
  png := TPngObject.Create;

  bmp.SetSize(100,100);

  With bmp.Canvas do
  begin
    Pen.Width := 5;
    Pen.Color := clRed;
    Rectangle(10,10,30,30);
    TextOut(5,5,'Test1');
  end;

  bmp.TransparentColor := clWhite;
  bmp.TransparentMode := tmFixed;
  bmp.Transparent := True;

  png.Assign(bmp);
  png.SaveToFile('C:\temp\'+outputfilename+'.png');

  png.Free;
  bmp.Free;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Einmal im Leben ein "richtiges" PNG-Bild erstellen

  Alt 13. Dez 2016, 09:39
Du hast es ja nicht mal versucht.
Nicht einfach nur das Bitmap assignen.
Du musst die Transparenz über das PNG Objekt selbst einstellen.

PS: Man sollte TPNGImage und nicht TPNGObject benutzen:

TPNGImage.TransparencyMode
TPNGImage.AlphaScanline
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
geesmith

Registriert seit: 17. Jan 2003
Ort: Frauenfeld
32 Beiträge
 
Delphi XE5 Architect
 
#6

AW: Einmal im Leben ein "richtiges" PNG-Bild erstellen

  Alt 13. Dez 2016, 13:17
Danke Michael für deinen kleinen Denkanstoss. Ich hatte es schon probiert, habe aber aufgeben müssen da ich noch auf dem falschen Denkweg lag. Mittlerweile krieg ich es mit dem folgenden Code hin. Das scheint wirklich zu funktionieren ...und du hattest recht "vergiss assign()" .

Mittlerweile schnall ich den Code. Noch eine Frage... Warum sollte man TPNGImage und nicht TPNGObject benutzen?

Code:
var
  bmp:TBitmap;
  png:TPngImage;
  Line: PByteArray;
  y,x:Integer;
  PixColor, TransColor: TColor;
begin
  TransColor := clWhite;
  // Bitmap zeichnen
  bmp := TBitmap.Create;
  bmp.SetSize(100,100);
  With bmp.Canvas do
  begin
    Brush.Color := TransColor;
    FillRect(rect(0,0,bmp.Width,bmp.Height));
    Pen.Width := 5;
    Pen.Color := clRed;
    Rectangle(20,30,80,90);
    Pen.Width := 10;
    Pen.Color := clRed;
    Rectangle(50,40,70,70);
    TextOut(5,5,DateTimeToStr(now));
  end;
  bmp.TransparentColor := TransColor;
  bmp.TransparentMode := tmFixed;
  bmp.Transparent     := True;
  // Erstellen des PNG-Image
  png := TPngImage.CreateBlank(COLOR_RGBALPHA, 8, bmp.Width, bmp.Height);
  try
    for y := 0 to bmp.Height - 1 do
    begin
      Line := png.AlphaScanline[y];
      for x := 0 to bmp.Width - 1 do
      begin
        PixColor := bmp.Canvas.Pixels[x,y];
        png.Pixels[x,y] := PixColor;
        if PixColor = TransColor then
          Line^[x] := 0
        else
          Line^[x] := 255;
      end;
    end;
    png.SaveToFile('c:\temp\pngtrans6.png');
  finally
    png.Free;
  end;
  bmp.Free;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Einmal im Leben ein "richtiges" PNG-Bild erstellen

  Alt 13. Dez 2016, 13:57
Schön dass dus hinbekommen hast

TPNGImage ist einfach nur der neue Name.
TPNGObject ist laut Embarcadero die veraltete Version.

Letztendlich wird es (erst mal) wohl keinen Unterschied machen.
Aber mit "TPNGImage" bist du "zukunftssicher".
Da TPNGObject veraltet ist kann es sein, dass es in einer kommenden Version nicht mehr existiert.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  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 15:47 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