Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#34

AW: Array of Integer und crash

  Alt 19. Mär 2017, 23:58
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

Geändert von EWeiss (11. Jul 2019 um 16:46 Uhr)
  Mit Zitat antworten Zitat