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^ = 'IHDR' then
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;