Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#9

AW: Bit-Tiefe in PNG ermitteln

  Alt 26. Mär 2020, 23:53
Jain,

Farbtiefe ist bei i+8+8 schon korrekt. Aber Farbtiefe ist ja nicht Colortype. Der steht im Byte dahinter.

Also könnte sowas dadraus werden (nur hingedaddelt):
Delphi-Quellcode:
type
  TChunkname = array[0..3] of AnsiChar;
  
function SwapEndianness(i: Integer): Integer;
begin
  Result := ((i and $FF000000) shr 24) or
            ((i and $00FF0000) shr 8) or
            ((i and $0000FF00) shl 8) or
            ((i and $000000FF) shl 24);
end;

var
  i: Integer;
  Nutzdaten: Pinteger;
  bs: TBytesStream;
  m: TBytes;
  Chunkname: ^TChunkname;
  Farbtiefe: PByte;
  Farbtyp: PByte;

begin
  bs := TBytesStream.Create();
  try
    bs.LoadFromFile('bla.png');
    m := bs.Memory;
    i := 8; // skip header
    while i < bs.Size - 8 do
    begin
      Nutzdaten := @m[i];
      Chunkname := @m[i+4];
      
      if Chunkname^ = 'IHDRthen
      begin
        Farbtiefe := @m[i+8+8];
        Farbtyp := @m[i+8+8+1];
        Break;
      end;
      
      inc(i, SwapEndianness(Nutzdaten^)+12);
    end;
  finally
    m := 0;
    bs.Free();
  end;
  // Tu was mit Farbtyp^, in deinem Fall mit 3 vergleichen
end;
  Mit Zitat antworten Zitat