Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi PNG 16 Bit Grayscale erzeugen (https://www.delphipraxis.net/164745-png-16-bit-grayscale-erzeugen.html)

CarlAshnikov 28. Nov 2011 13:45

PNG 16 Bit Grayscale erzeugen
 
Hallo,

für ein aktuelles Projekt soll ich das Bild einer Kamera, dass ich in 12bit Helligkeitswerten abrufe, als 16bit PNG abspeichern.

Versucht habe ich das Ganze mit PNGImage. Beim Speichern der Datei bekomme ich allerdings eine Exception. Folgendes klappt schon nicht:
Code:
  PNG := tPNGobject.CreateBlank(COLOR_GRAYSCALE, 16, 1024, 512);
  try
    for Y := 0 to 511 do
    begin
      for X := 0 to 1023 do
      begin
        PNG.Pixels[X, Y] := 1;
      end;
    end;
    PNG.SaveToFile('test.png');
  finally
    PNG.free;
  end;
Ändere ich die BitDepth im Constructor von 16 in 8 läuft alles wie gewünscht.
CodeZeilen wie:
Code:
if Bitdepth = 16 then Bitdepth := 8;
machen mir irgendwie auch wenig Hoffnung, dass die 16 Bit Grauwertgeschichte hiermit klappt.

Vielleicht kennt jemand eine Lösung des Problems oder eine passende Alternative.

Medium 28. Nov 2011 14:29

AW: PNG 16 Bit Grayscale erzeugen
 
Fehlermeldungen hier auch hinzuschreiben ist total out mittlerweile, oder? :gruebel:

Bernhard Geyer 28. Nov 2011 14:35

AW: PNG 16 Bit Grayscale erzeugen
 
Meinst du die ehemalige freie PNG-Komponente.

Hab so die Erfahrung das diese mit 16-Bit Farbtiefe so ihre Probleme hat (Falschfarben) ...

CarlAshnikov 29. Nov 2011 06:31

AW: PNG 16 Bit Grayscale erzeugen
 
Zitat:

Zitat von Medium (Beitrag 1138244)
Fehlermeldungen hier auch hinzuschreiben ist total out mittlerweile, oder? :gruebel:

Falls es etwas hilft, aus der PNGImage.pas:
Code:
{Saves the PLTE chunk to a stream}
function TChunkPLTE.SaveToStream(Stream: TStream): Boolean;
var
  J: Integer;
  DataPtr: pByte;
  BitmapInfo: TMAXBITMAPINFO;
  palEntries: TMaxLogPalette;
begin
  {Adjust size to hold all the palette items}
  if fCount = 0 then fCount := Header.BitmapInfo.bmiHeader.biClrUsed;
  ResizeData(fCount * 3);
  {Get all the palette entries}
  fillchar(palEntries, sizeof(palEntries), #0);
  GetPaletteEntries(Header.ImagePalette, 0, 256, palEntries.palPalEntry[0]);
  {Copy pointer to data}
  DataPtr := fData;

  {Copy palette items}
  BitmapInfo := Header.BitmapInfo;
  FOR j := 0 TO fCount - 1 DO
    with palEntries.palPalEntry[j] do
    begin
      DataPtr^ := Owner.InverseGamma[peRed]; inc(DataPtr); <---- Exception
      DataPtr^ := Owner.InverseGamma[peGreen]; inc(DataPtr);
      DataPtr^ := Owner.InverseGamma[peBlue]; inc(DataPtr);
    end {with BitmapInfo};

  {Let ancestor do the rest of the work}
  Result := inherited SaveToStream(Stream);
end;
Folgender Fehler tritt auf:

Zugriffsverletzung bei Adresse 00450768 in Modul 'Project1.exe'. Lesen von Adresse 00134000. Prozess angehalten. ...

Ich gehe davon aus, dass an mancher Stelle mit 16 Bit und an anderer Stelle mit 8 Bit gearbeitet wird und dann auf Speicherbereiche zugegriffen wird wo einfach nichts ist.

Zitat:

Hab so die Erfahrung das diese mit 16-Bit Farbtiefe so ihre Probleme hat (Falschfarben) ...
Ist mir eigentlich egal da ich nur Grauwerte brauche :-D. Oder betrifft die das auch?

Wie gesagt, ich muss das Problem nicht mit dieser Komponente lösen habe aber beim Suchen noch kein andere gefunden.

Bernhard Geyer 29. Nov 2011 07:44

AW: PNG 16 Bit Grayscale erzeugen
 
Zitat:

Zitat von CarlAshnikov (Beitrag 1138348)
Wie gesagt, ich muss das Problem nicht mit dieser Komponente lösen habe aber beim Suchen noch kein andere gefunden.

Du könntest mit der Trial von Delphi XE2 schauen ob dort es geht oder die Komponenten von LMD ausprobieren. Diese basieren auf der freien PNG-Komponente haben aber schon einige Bugfixes erhalten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 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