Das sieht aber immer noch nicht so aus, wie ich das gezeigt hatte:
Sorry das mit GetMem funktioniert nicht.
GetMem erwartet einen Pointer PropItem ist aber als TPropertyItem definiert.
Was aber korrekt ist ich muss den Speicher vor GetPropertyItem allokieren ich habe es nachher gemacht.
EDIT:
OK hab dich verstanden funktioniert jetzt
Danke für deine Mühe und Zeit.
Habe wieder einiges gelernt.
So soll es sein das Ergebniss.. jedes Frame läuft 80ms.
Hier nochmal das gesamt Ergebnis vielleicht kann es ja mal jemand brauchen.
Delphi-Quellcode:
procedure TAnimateGif.GetGifFrameDelays(GifImage: Cardinal; FrameCount: UINT;
var FrameDelay: TFrameDelay);
var
ISize: integer;
PropSize: UINT;
Prop: TProp;
PropCount: integer;
begin
ISize := 0;
// Datengröße vom EXIF-Tag PropertyTagFrameDelay ermitteln
if GDIP_GetPropertyItemSize(GifImage, PropertyTagFrameDelay, PropSize) = S_OK then
begin
// Speicher allokieren
GetMem(PropItem, PropSize);
// Daten auslesen
if GetPropertyItem(GifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then
begin
// Bytearray dimensionieren
SetLength(Prop, (PropItem.length + 1));
CopyMemory(@Prop[0], PropItem.value, PropItem.length);
// PropertyTyp ermitteln
case PropItem.type_ of
PropertyTagTypeByte:
ISize := 1;
PropertyTagTypeShort:
ISize := 2;
PropertyTagTypeLong:
ISize := 4;
end;
// Array zur Aufnahme der Pausenzeiten dimensionieren
SetLength(FrameDelay, FrameCount);
// Pausenzeiten der einzelnen Bilder aus Bytearray kopieren
for PropCount := 0 to (FrameCount - 1) do
begin
CopyMemory(@FrameDelay[PropCount], @Prop[PropCount * ISize], ISize);
FrameDelay[PropCount] := FrameDelay[PropCount] * 10;
end;
end;
FreeMem(PropItem);
end;
end;
gruss