Jetzt bin ich allerdings auf zwei Probleme gestoßen bei Bilder von Kameras der Firma Yuneec. Diese Bilder möchte ich mit Geodaten (Koordinaten und Höhe) nachrüsten.
1. Problem:
Die Metadaten enthalten Segmente mit DataType=0. Dies führt bei aImgInfo.LoadFromFile zum Fehler rsIncorrectTagType und man kann die restlichen EXIF Daten nicht lesen.
Ich habe in fpeExifReadWrite den Fehleraussprung bei ifdRec.DataType=0; einfach übersprungen. Dann funktioniert zumindest das Lesen der weiteren Daten ohne (sichtbare) Probleme.
Meine Frage ist, welche Konsequenzen das wirklich hat, denn die überschaue ich mangels Kenntnisse nicht wirklich.
Code: Alles auswählen
in file "fpeExifReadWrite", procedure TBasicExifReader.ReadIFD(AStream: TStream; AParent: TTagID);
// File fpeExifReadWrite: Skip TagType 0 from Yuneec cam CGO3
[b]if ifdRec.DataType<>0 then[/b] // No error handling in case TagType=0
if not (ifdRec.DataType in [1..ord(High(TTagType))]) then begin
Error(Format(rsIncorrectTagType, [ifdRec.DataType, i, ifdRec.TagID, FImgInfo.Filename]));
exit;
end;
....
Einige Bilder enthalten Segmente, die nach den Daten mit 00-Bytes aufgefüllt sind, warum auch immer. Auch bricht das
Beholfen habe ich mir damit, dass ich die Nullen überspringe bis zum nächsten headerKey.
Auch hier wieder die Frage, ob ich mit unerwarteten Effekten rechnen muss oder ob das ein gangbarer Weg ist. Bei meinen Tests schien es OK.
Code: Alles auswählen
In "fpemetadata.pas", procedure TImgInfo.MergeToJpegStream(AInputStream, AOutputStream: TStream);
// In some pictures the space between segments is filled with $00 (patch 11/2020)
if header.Key = 0 then
repeat //skip unnecessary $00
inc(savedPos);
AInputStream.Position := savedPos; // Read next byte
n := AInputStream.Read(header{%H-}, SizeOf(header));
if n <> Sizeof(header) then
Error(rsIncompleteJpegSegmentHeader);
until header.Key <> 0; // something else, hopefully a new segment
--------------------------------------------------------------------------------
if header.Key <> $FF then
Error(rsJpegSegmentMarkerExpected);
header.Size := BEToN(header.Size);
....
Gruß HE