Ich habe mal etwas herumprobiert, wie ich das Wort "Kommentar" entsprechend den oben erläuterter Tipps eingeben kann.
Das funktioniert anscheinend korrekt
Hier mein Test-Programm um einen Kommentar einzufügen:
(1A 00 00 00 bestimmt wahrscheinlich den Ort des Eintrages von Byte-Order 49 49 aus gezählt ?)
Delphi-Quellcode:
procedure TForm1.WriteExifStream(SelectedRoot, SelectedFile: string);
var
fs: TFileStream;
ba, bb, bc: array of byte;
i, j, FFE0_pos, FFE0_len: integer;
begin
if AnsiLastChar(SelectedRoot)^ <> '\' then SelectedRoot := SelectedRoot + '\';
fs := TFilestream.Create(SelectedRoot + SelectedFile ,fmopenread or fmShareDenyNone);
SetLength(ba, fs.Size);
fs.Read(ba[0], Length(ba));
fs.Free;
SetLength(bb, 57);
SetLength(bc, Length(ba) + Length(bb));
{FF E1 -> EXIF Tag}
bb[0] :=StrToInt('$FF');;
bb[1] :=StrToInt('$E1');;
{00 36 -> Länge des Bereichs , also 57 Bytes}
bb[2] :=StrToInt('$00'); //HL
bb[3] :=StrToInt('$39'); //LL
{45 78 69 66 00 00 -> EXIF Name}
bb[4] :=StrToInt('$45');
bb[5] :=StrToInt('$78');
bb[6] :=StrToInt('$69');
bb[7] :=StrToInt('$66');
bb[8] :=StrToInt('$00');
bb[9] :=StrToInt('$00');
{49 49 -> Byte Order, hier Intel [Little Endian] !!! wichtig !!!}
bb[10]:=StrToInt('$49');
bb[11]:=StrToInt('$49');
{2A 00 -> TIFF Kennung (Tagged Image File Format)}
bb[12]:=StrToInt('$2A'); //2A 42
bb[13]:=StrToInt('$00');
{08 00 00 00 -> IFD, File Descriptor - gibt an ob daten gleich folgen oder ob ein offset hinterlegt ist}
bb[14]:=StrToInt('$08');
bb[15]:=StrToInt('$00');
bb[16]:=StrToInt('$00');
bb[17]:=StrToInt('$00');
{01 00 -> Anzahl der EXIF Elemente - hier also 1 }
bb[18]:=StrToInt('$01');
bb[19]:=StrToInt('$00');
{9C 9C -> EXIF Element - hier also Kommentar (s.o.) }
bb[20]:=StrToInt('$9C');
bb[21]:=StrToInt('$9C');
{01 00 -> Datentyp - hier Bytes}
bb[22]:=StrToInt('$01');
bb[23]:=StrToInt('$00');
{16 00 00 00 -> Länge des Eintrages - hier als 22 Bytes / Zeichen}
bb[24]:=StrToInt('$16');
bb[25]:=StrToInt('$00');
bb[26]:=StrToInt('$00');
bb[27]:=StrToInt('$00');
{1A 00 00 00 -> Entweder Wert selbst oder offset wo daten zu finden sind - hier offset}
bb[28]:=StrToInt('$1A'); //26 Bytes von Byte-Order 49 49 weiterzählen
bb[29]:=StrToInt('$00');
bb[30]:=StrToInt('$00');
bb[31]:=StrToInt('$00');
{}
bb[32]:=StrToInt('$00');
bb[33]:=StrToInt('$00');
bb[34]:=StrToInt('$00');
bb[35]:=StrToInt('$00');
{Eintrag selbst, Länge oben definiert}
bb[36]:=StrToInt('$4B');
bb[37]:=StrToInt('$00');
bb[38]:=StrToInt('$6F');
bb[39]:=StrToInt('$00');
bb[40]:=StrToInt('$6D');
bb[41]:=StrToInt('$00');
bb[42]:=StrToInt('$6D');
bb[43]:=StrToInt('$00');
bb[44]:=StrToInt('$65');
bb[45]:=StrToInt('$00');
bb[46]:=StrToInt('$6E');
bb[47]:=StrToInt('$00');
bb[48]:=StrToInt('$74');
bb[49]:=StrToInt('$00');
bb[50]:=StrToInt('$61');
bb[51]:=StrToInt('$00');
bb[52]:=StrToInt('$72');
bb[53]:=StrToInt('$00');
bb[54]:=Ord('!');
bb[55]:=StrToInt('$00');
bb[56]:=Ord('?');
bb[57]:=StrToInt('$00');
for i := 0 to 1 do bc[i] := ba[i];
for i := 0 to High(bb)+2 do bc[i+2]:= bb[i];
for i := 2 to High(ba) do bc[i+High(bb)+2]:= ba[i];
//Buffer ba in neues File im Verzeichnis SDSRECS schreiben
fs := TFileStream.Create(SelectedRoot + 'Neu.jpg', fmCreate);
try
fs.Writebuffer(bc[0], Length(bc));
finally
fs.Free;
end;
end;
Folgende Besonderheiten verstehe ich aber leider nicht, so dass ich keine für alle Fälle passende Funktion programmieren kann:
1. Problem
Wenn ich meine zunächst mit Delphi eingetragenen EXIF-Daten nachträglich über die Windows-XP-Dateifunktion bearbeite,
wird meine Zeichenfolge von Windows akzeptiert, aber eine Zeile voran neu eingefügt, die ich nicht verstehe:
FF D8
FF EE 00 0E 41 64 6F 62 65 00 64 00 00 00
00 01 FF E1 00 4E 45 78 69 66 00 00 49 49 2A 00
2. Problem
Noch merkwürdiger ist folgendes Verhalten (so dass ich solche mir unverständlichen
Exif-Daten leider nicht selbst weiterbearbeiten kann):
Sobald ich aber über die Windows-XP-Dateifunktion den Kommentar "Kommentar" eingebe,
kommt eine ganz andere Byte-Folge heraus:
erst kommt der Header FF D8, als zweites kommt erst der Header FF E0 ....
danach erst die Exif-Daten FF E1 ......, später wiederholt sich merkwürdigerweise der Header FF D8 FF E0
Ist das ein WindowsXP-Bug ?
FF D8 FF E0 00 10 4A 46 49 46 00 01 02 01 00 48
00 48 00 00
FF E1 0B 2C 45 78 69 66 00 00 49 49
2A 00 08 00 00 00 04 00 1A 01 05 00 01 00 00 00
3E 00 00 00 1B 01 05 00 01 00 00 00 46 00 00 00
28 01 03 00 01 00 00 00 02 00 00 00 9C 9C 01 00
14 00 00 00 4E 00 00 00 62 00 00 00 00 00 48 00
00 00 01 00 00 00 48 00 00 00 01 00 4B 00 6F 00
6D 00 6D 00 65 00 6E 00 74 00 61 00 72 00 00 00
03 00 03 01 03 00 01 00 00 00 06 00 00 00 01 02
04 00 01 00 00 00 8C 00 00 00 02 02 04 00 01 00
00 00 98 0A 00 00 00 00 00 00 FF D8 FF E0 00 10
4A 46 49 46 00 01 02 01 00 48 00 48 00 00 FF EE