Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben[gelöst]

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben[gelöst]

Beitrag von corpsman »

Servus zusammen,
ich bastle ja gerade an meinem Pixeleditor. Zum testen nutze ich ihn quasi täglich, heute stand auf dem Programm diverse .png Dateien zu erstellen, alle mit Transparenz (bisher hatte ich immer nur .bmp erstellt, bei denen clFuchsia als Transparent interpretiert wurde).

Zum Laden habe ich folgenden Code, und dieser Funktioniert 1a

Code: Alles auswählen

type
  TRGBA = Record
    r, g, b, a: Byte;
  End;  
  
Procedure TImage.ImportFromPNG(aFilename: String);
Var
  png: TPortableNetworkGraphic;
  b: TBitmap;
  i, j: Integer;
  TempIntfImg: TLazIntfImage;
  c: TRGBA;
Begin
  b := TBitmap.Create;
  png := TPortableNetworkGraphic.Create;
  png.LoadFromFile(aFilename);
  b.Assign(png);
  png.free;
  SetSize(b.Width, b.Height);
  TempIntfImg := TLazIntfImage.Create(0, 0);
  TempIntfImg.LoadFromBitmap(b.Handle, b.MaskHandle);
  BeginUpdate;
  For j := 0 To height - 1 Do Begin
    For i := 0 To Width - 1 Do Begin
      c := FPColorToRGBA(TempIntfImg.Colors[i, j]);
      c.a := 255 - c.a;
      SetColorAt(i, j, c);
    End;
  End;
  EndUpdate;
  TempIntfImg.free;
  b.free;
  fChanged := false;
  Filename := aFilename;
End;                
Mein Problem ist das Schreiben, lade ich also mit obigem Code ein Bild wird es korrekt angezeigt, auch der Export nach .bmp wandelt die Transparenten Pixel sauber um in clFuchsia (ich hab nur volle Transparenz oder keine).

Code: Alles auswählen


Procedure TImage.ExportAsPNG(aFilename: String);
Var
  png: TPortableNetworkGraphic;
  b: Tbitmap;
  TempIntfImg: TLazIntfImage;
  ImgHandle, ImgMaskHandle: HBitmap;
  j, i: Integer;
  c: TRGBA;
Begin
  b := TBitmap.Create;
  b.Width := Width;
  b.Height := Height;
  TempIntfImg := TLazIntfImage.Create(0, 0, [riqfRGB, riqfAlpha]);
  TempIntfImg.LoadFromBitmap(b.Handle, b.MaskHandle);
  TempIntfImg.SetSize(Width, Height);
  For j := 0 To height - 1 Do Begin
    For i := 0 To Width - 1 Do Begin
      c := GetColorAt(i, j);
      c.a := 255 - c.a;
      TempIntfImg.Colors[i, j] := RGBAToFPColor(c);
    End;
  End;
  TempIntfImg.CreateBitmaps(ImgHandle, ImgMaskHandle, false);
  b.Handle := ImgHandle;
  b.MaskHandle := ImgMaskHandle;
  png := TPortableNetworkGraphic.Create;
  png.Assign(b);
  png.SaveToFile(aFilename);
  png.free;
  TempIntfImg.free;
  b.free;
  fChanged := false;
  Filename := aFilename;
End;   
Egal wie, alle Pixel die Transparent sein sollten sind hier beim Exportieren immer Schwarz, Lade ich die so erstellten .png Dateien in einem Anderen Programm, kann man sehen dass die Alphamaske überall Opak ist.
Weiß einer hier im Forum was ich falsch mache ?
Zuletzt geändert von corpsman am Sa 12. Okt 2024, 16:32, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben

Beitrag von corpsman »

OK nu wird es immer verrückter,

Ohne dass ich am Code was ändere geht es manchmal und manchmal nicht.
Ich bin hier auf Linux Mint Mate, starte wie verrückt die Anwendung neu lade .bmp Dateien / Speichere .png Dateien und schau mir die gespeicherten .png Dateien an.
Das Ergebnis
Mal sind die .png Dateien komplett weiß (obwohl ich weis gar nicht in den bildern verwende)
Mal sind die teile die Transoarent sein sollten schwarz, der Rest stimmt aber
Mal sind die Bilder korrekt

Speicherlöcher habe ich nicht laut heaptrace hier folgt noch meine Lazarus / FPC Version ...
Lazarus 3.99 (rev main_3_99-2821-gcbc3f3751c) FPC 3.2.2 x86_64-linux-gtk2
--
Just try it

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben

Beitrag von theo »

K.A. aber was tut " c := GetColorAt(i, j);" ?
Worauf bezieht sich das?

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben

Beitrag von corpsman »

die Timage Klasse hat einen internen Pixelpuffer

getColorAt liest die Farbe an dieser Position aus

Code: Alles auswählen


Procedure TImage.ExportAsBMP(aFilename: String; TransparentColor: TRGBA);
Var
  b: Tbitmap;
  TempIntfImg: TLazIntfImage;
  ImgHandle, ImgMaskHandle: HBitmap;
  j, i: Integer;
  c: TRGBA;
Begin
  b := TBitmap.Create;
  b.Width := Width;
  b.Height := Height;
  TempIntfImg := TLazIntfImage.Create(0, 0);
  TempIntfImg.LoadFromBitmap(b.Handle, b.MaskHandle);
  For j := 0 To height - 1 Do Begin
    For i := 0 To Width - 1 Do Begin
      c := GetColorAt(i, j);
      If c = ColorTransparent Then Begin
        TempIntfImg.Colors[i, j] := RGBAToFPColor(TransparentColor);
      End
      Else Begin
        TempIntfImg.Colors[i, j] := RGBAToFPColor(c);
      End;
    End;
  End;
  TempIntfImg.CreateBitmaps(ImgHandle, ImgMaskHandle, false);
  b.Handle := ImgHandle;
  b.MaskHandle := ImgMaskHandle;
  TempIntfImg.free;
  b.SaveToFile(aFilename);
  b.free;
  fChanged := false;
  Filename := aFilename;
End;               
So sieht das aus, wenn ein .bmp gespeichert wird und das geht 1a
Aktuell teste ich wie folgt:
1. Program starten
2. Auf einem Neuen Bild rumpkritzeln, speichern als .bmp, speichern als .png -> Alles so wie es sein soll
3. ein .bmp laden speichern als .bmp speichern als .png, das gespeicherte .bmp ist korrekt, das PNG ist einfach nur weis
4. die klasse zurücksetzen schritt 2 widerhohlen

=> mindestens Ein BMP laden als png speichern ist also kaputt, wenn ich aber ein .bmp Lade und wieder neu speichere ist das gespeicherte 1a, und der debugger sagt mir auch, dass alle Pixel sind wie sie sein sollten..

5. Ein "ganzes" png laden und speichern scheint auch zu gehen ..
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben

Beitrag von corpsman »

Also der Folgende Code sollte doch wenigstens irgendwas erzeugen

Code: Alles auswählen

Procedure TImage.ExportAsPNG(aFilename: String);
Var
  png: TPortableNetworkGraphic;
  i, j: integer;
  c: TRGBA;
  a: Array[0..4] Of TRGBA;
Begin
  png := TPortableNetworkGraphic.Create;
  png.PixelFormat := pf32bit;
  png.Transparent := true;
  png.Width := Width;
  png.Height := Height;
  a[0] := rgba(255, 255, 255, 255);
  a[1] := rgba(0, 0, 0, 255);
  a[2] := rgba(255, 255, 255, 0);
  a[3] := rgba(0, 0, 0, 0);
  For j := 0 To height - 1 Do Begin
    For i := 0 To Width - 1 Do Begin
      c := a[i Mod 4];
      png.Canvas.Pixels[i, j] := (c.a Shl 24) Or (c.b Shl 16) Or (c.g Shl 8) Or (c.r);
    End;
  End;
  png.SaveToFile(aFilename);
  png.Free;
  fChanged := false;
  Filename := aFilename;
End;
Das so geschriebene .png ist aber komplett durchsichtig und Farblos :roll:
--
Just try it

wp_xyz
Beiträge: 5189
Registriert: Fr 8. Apr 2011, 09:01

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben

Beitrag von wp_xyz »

Ich verstehe jetzt nicht, warum du statt sauberer Alpha-Transparenz die altertümliche und artefakt-reiche Farbtransparenz verwenden willst, aber du wirst schon wissen, was du tust.

Ich gebe dir recht, dass der Kampf zwischen Transparenz und schwarzem Hintergrund bei Lazarus manchmal zum Haare ausraufen ist.

Bei solchen Fällen weiche ich immer auf FCL-Image aus, da braucht man zwar mehr Code, hat aber mehr Kontrolle. Das entsprechende FPCustomImage hast du als LazIntfImage schon erzeugt. Aber beim Abspeichern von Alpha-transparenten PNGs ist der Trick, den dafür vorgesehenen Writer zu erzeugen und dessen Eigenschaft "UseAlpha" auf true zu setzen.

Das beigefügte Beispiel funktioniert auf jedem Fall unter Windows richtig. Unter Linux (gtk2) allerdings ist manchmal das Pixelformat sehr störrisch. Bist du sicher, dass es immer auf pf32Bit steht?
Dateianhänge
MakeAlpha.zip
(5.54 KiB) 90-mal heruntergeladen

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben

Beitrag von corpsman »

@wp_xyz
Danke mit deinem Beispiel konnte ich meine Methode umschreiben zu:

Code: Alles auswählen

Procedure TImage.ExportAsPNG(aFilename: String);
Var
  png: TPortableNetworkGraphic;
  b: Tbitmap;
  TempIntfImg: TLazIntfImage;
  j, i: Integer;
  c: TRGBA;
  writer: TFPWriterPNG;
Begin
  // 1. Convert to BMP
  b := TBitmap.Create;
  b.PixelFormat := pf32bit;
  TempIntfImg := b.CreateIntfImage;
  TempIntfImg.SetSize(Width, Height);
  For j := 0 To height - 1 Do Begin
    For i := 0 To Width - 1 Do Begin
      c := GetColorAt(i, j);
      c.a := 255 - c.a;
      TempIntfImg.Colors[i, j] := RGBAToFPColor(c);
    End;
  End;
  b.LoadFromIntfImage(TempIntfImg);
  TempIntfImg.free;
  // 2. Store as .png
  png := TPortableNetworkGraphic.Create;
  png.Assign(b);
  b.free;
  TempIntfImg := png.CreateIntfImage;
  writer := TFPWriterPNG.Create;
  writer.UseAlpha := true;
  TempIntfImg.SaveToFile(aFilename, writer);
  writer.Free;
  TempIntfImg.Free;
  png.free;
  fChanged := false;
  Filename := aFilename;
End;
Damit kann ich nun ein .bmp laden und als .png abspeichern und alles ist wie ich es erwarte :D
--
Just try it

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben

Beitrag von theo »

Ja, da hat WP natürlich recht.
Allgemein: Je höher du in der Hierarchie bist, desto weniger Kontrolle hast du über das Format.
Aber es erscheint natürlich erst einmal einfacher.

wp_xyz
Beiträge: 5189
Registriert: Fr 8. Apr 2011, 09:01

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben[gelöst]

Beitrag von wp_xyz »

Das LazIntfImage ist eigentlich universell, d.h. vom Dateiformat unabhängig. Sobald du ein LazIntfImage hast, kannst du es in jedem Format speichern. Die Umwandlung des Bitmap nach PNG sollte nicht erforderlich sein, sofern das Ausgangsbitmap einen Alpha-Kanal hat (pf32Bit) und der PNG-Writer mit UseAlpha=true verwendet wird. (Mit dem BMP-Writer würdest du ein .bmp erzeugen, mit dem JPEG-Writer ein .jpg, wobei aber der Alpha-Kanal verloren geht, weil der BMP-Writer kein "UseAlpha" hat, und der JPEG-Writer eh nur 24 bit unterstützt. Aber prinzipiell ist der Alpha-Kanal in dem LazIntfImage immer vorhanden, wenn du es entsprechend erzeugt hast).

Ungetestet:

Code: Alles auswählen

Procedure TImage.ExportAsPNG(aFilename: String);
Var
  b: Tbitmap;
  TempIntfImg: TLazIntfImage;
  j, i: Integer;
  c: TRGBA;
  writer: TFPWriterPNG;
Begin
  // 1. Convert to BMP
  b := TBitmap.Create;
  b.PixelFormat := pf32bit;
  TempIntfImg := b.CreateIntfImage;
  TempIntfImg.SetSize(Width, Height);
  For j := 0 To height - 1 Do Begin
    For i := 0 To Width - 1 Do Begin
      c := GetColorAt(i, j);
      c.a := 255 - c.a;
      TempIntfImg.Colors[i, j] := RGBAToFPColor(c);
    End;
  End;
  writer := TFPWriterPNG.Create;
  writer.UseAlpha := true;
  TempIntfImg.SaveToFile(aFilename, writer);
  writer.Free;
  TempIntfImg.Free;
  b.free;
  fChanged := false;
  Filename := aFilename;
End;

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben[gelöst]

Beitrag von corpsman »

Sodale,
also getestet habe ich nu beide Versionen von wp_xyz, und beide gehen.
Der XnView MP bestätigt auch, dass die so erstellten .png Dateien gültig sind. Leider kann KolourPaint die Bilder nicht fehlerfrei laden :/. Konvertiere ich sie mit dem Consolentool "convert" aber in .bmp Dateien kann KolourPaint die Bilder wieder Fehlerfrei darstellen...

Was auch merkwürdig ist, in meinem PNG_Editor funktioniert der "Alte" weg, der im Pixeleditor nicht geht.

Die Alte "Variante 2" erzeugt dabei kleinere .png Dateien die Kolourpaint auch wieder tadellos laden kan. Unten sind beide Varianten im selben Speichern Code aus dem PNG_Editor zu sehen ..

Code: Alles auswählen

Procedure TForm1.Button6Click(Sender: TObject);
Var
  DestBitmap: TBitmap;
  NormalSource, AlphaSource, Dest: TLazIntfImage;
  NormalColor, AlphaColor: TFPColor;
  ImgHandle, ImgMaskHandle: HBitmap;
  png: TPortableNetworkGraphic;
  i, j: Integer;
  writer: TFPWriterPNG;
Begin
  If Not assigned(fNormalImage) Or Not assigned(fAlphaImage) Then Begin
    showmessage('Error, need both images to store as .png');
    exit;
  End;
  If (fAlphaImage.Width <> fNormalImage.Width) Or (fAlphaImage.Height <> fNormalImage.Height) Then Begin
    ShowMessage('Error, alphamask and normal image differ in size.');
    exit;
  End;
  // Save PNG
  If SaveDialog2.Execute Then Begin
    DestBitmap := TBitmap.Create;
    DestBitmap.PixelFormat := pf32bit; // Wichtig für Alpha !

    NormalSource := TLazIntfImage.Create(0, 0);
    NormalSource.LoadFromBitmap(fNormalImage.Handle, fNormalImage.MaskHandle);
    AlphaSource := TLazIntfImage.Create(0, 0);
    AlphaSource.LoadFromBitmap(fAlphaImage.Handle, fAlphaImage.MaskHandle);

    Dest := DestBitmap.CreateIntfImage;
    Dest.SetSize(fAlphaImage.Width, fAlphaImage.Height);

    For i := 0 To fAlphaImage.Width - 1 Do Begin
      For j := 0 To fAlphaImage.Height - 1 Do Begin
        NormalColor := NormalSource.Colors[i, j];
        AlphaColor := AlphaSource.Colors[i, j];
        NormalColor.Alpha := AlphaColor.red; // Egal ist ja eh Graustufen
        Dest.Colors[i, j] := NormalColor;
      End;
    End;

    DestBitmap.LoadFromIntfImage(dest);
    Dest.free;

    // Speichern als png - Variante 2
    png := TPortableNetworkGraphic.Create;
    png.Assign(DestBitmap);
    png.SaveToFile(SaveDialog2.Filename);
    png.free;
    // Ende Variante 2}

    {// Speichern als png - Variante 1
    png := TPortableNetworkGraphic.Create;
    png.Assign(DestBitmap);
    DestBitmap.free;
    dest := png.CreateIntfImage;
    writer := TFPWriterPNG.Create;
    writer.UseAlpha := true;
    dest.SaveToFile(SaveDialog2.Filename, writer);
    writer.Free;
    dest.free;
    png.free;
    // Ende Variante 1 }
  End;
End;  
=> So wie es aussieht fehlt beim TFPWriterPNG wohl irgend eine art der Komprimierung, dafür ist der Code aber wohl "stabiler"..
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben[gelöst]

Beitrag von corpsman »

So nu hab ich es endlich herausfegunden.

Durch genaue Sichtung der TFPWriterPNG Klasse kann man sehen, dass es da durchaus noch ein paar Attribute gibt, welche man setzen kann.

Erfolg stellte sich ein wenn man vor dem schreiben folgendes Attribut setzt:

Code: Alles auswählen

    writer.Indexed := true;
Damit aktiviert der Writer auch eine Kompression und die .png Bilder werden wieder deutlich kleiner. Und das beste nun mag auch Kolourpaint die Bilder wieder fehlerfrei darstellen ;)
--
Just try it

wp_xyz
Beiträge: 5189
Registriert: Fr 8. Apr 2011, 09:01

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben[gelöst]

Beitrag von wp_xyz »

Versteh ich nicht. FPWriterPNG.Index ist eigentlich dafür gedacht, Bilder mit Palette zu erstellen. Der in der Graphics-Unit verwendete PNG-Writer (TLazWriterPNG in IntfGraphics, von TFPWriterPNG abgeleitet) hat eine Methode Initialize, an der man schön sieht, wann die diversen Writer-Eigenschaften gesetzt werden:

Code: Alles auswählen

procedure TLazWriterPNG.Initialize(AImage: TLazIntfImage);
begin
  UseAlpha := AImage.DataDescription.AlphaPrec <> 0;
  GrayScale := AImage.DataDescription.Format = ricfGray;
  Indexed := AImage.DataDescription.Depth <= 8;
  WordSized := (AImage.DataDescription.RedPrec > 8)
            or (AImage.DataDescription.GreenPrec > 8)
            or (AImage.DataDescription.BluePrec > 8);
end; 
Indexed wird danach gesetzt, wenn das Bitmap höchstens 8 Bits pro Pixel hat.

Die von dem weiter oben angehängten Test-Projekt erzeugten png-Dateien werden auf meinem System (Win-11) von allen verfügbaren Graphik-Programmen korrekt gelesen (Irfanview, Paint, Paint3D, Windows Fotoanzeige, gimp, PhotoFiltre, Zoner Photo Studio, LibreOffice Draw), und auch auf einer VM mit Linux Mint kommen die Dateien richtig raus (nicht aber mit KolourPaint, wenn ich das nachinstalliere -- streifiges Bild).

Kannst du bitte mal ein kleines Minimal-Projekt schreiben, an dem ich (u.v. der Compiler) deinen Code direkt nachvollziehen kann? Und auch ein Bild beifügen, mit dem du den Fehler gesehen hast.

[EDIT]
Jetzt ist mir noch etwas aufgefallen: Das von dem o.e. Testprogramm erzeugte png hat lt Windows-Explorer eine Bit-Tiefe von 64 bit. Und im Source-Code von TFPWriterPNG.Create sieht man tatsächlich, dass WordSized auf true initialisiert wird - das heißt: jeder Farbkanal hat 16 bit. Setze ich das in meinem Testprogramm auf false, zeigt der Explorer wie erwartet nur 32-Bit. Und kopiere ich die Datei auf die Mint-VM wird sie auch mit KolourPaint korrekt angezeigt.

Fazit: KolourPaint scheint ein Problem mit 64bpp PNG-Dateien zu haben. Ob die Initialiserung von TFPWriterPNG.WordSized mit true ein Fehler ist, müsste man sich im Detail überlegen (ich denke aber, dass der Entwickler hauptsächlich TFPCustomImages im Sinn hatte, die tatsächlich 64-bpp bieten).

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben[gelöst]

Beitrag von corpsman »

So nachdem ich mir die Mühe schon gemacht habe die Demo zu schreiben, hänge ich sie auch mit an, auch wenn ich den EIndruck habe. Das du dem Thema schon auf die Spur gekommen bist ;)

Für alle die kein Linux zur Hand haben, so sieht das "Not indexed" im Kolourpaint aus.
Not_indexed_in_Kolourpaint.png
Not_indexed_in_Kolourpaint.png (31.52 KiB) 3415 mal betrachtet
[Edit]

Anstatt
writer.Indexed := true;
sollte ich also
writer.WordSized := false;
machen? Da dass dann wie erwartet die 32Bit Bilder erzeugt..

By the way, im Screenshot kann man übrigens auch sehen das Kolourpaint versucht das Bild als 32bpp dar zu stellen (siehe unten Rechts) :)
Dateianhänge
Demo.zip
(4.75 KiB) 114-mal heruntergeladen
--
Just try it

wp_xyz
Beiträge: 5189
Registriert: Fr 8. Apr 2011, 09:01

Re: Alphakanal wird bei TPortableNetworkGraphic nicht geschrieben[gelöst]

Beitrag von wp_xyz »

corpsman hat geschrieben: So 13. Okt 2024, 11:36 Anstatt
writer.Indexed := true;
sollte ich also
writer.WordSized := false;
machen? Da dass dann wie erwartet die 32Bit Bilder erzeugt..
Ja, das meine ich. Obwohl: Wenn die Palettenfarben, die mit Indexed = true entstehen, auch 32bit haben, sollte es auch gehen; und wenn viele identische Farben vorhanden sind, wird die Datei auch kleiner als die mit Indexed = false.
corpsman hat geschrieben: So 13. Okt 2024, 11:36 By the way, im Screenshot kann man übrigens auch sehen das Kolourpaint versucht das Bild als 32bpp dar zu stellen (siehe unten Rechts) :)
Das ist ganz schön verwirrend. KolourPaint zeigt auch beim "index"-Bild 32bpp an (vielleicht weil die Paletten-Farben 32bpp haben?), IrfanView und Explorer 8bpp...

Antworten