Einzelnen Beitrag anzeigen

Ralf Stehle

Registriert seit: 8. Aug 2003
124 Beiträge
 
Delphi 7 Professional
 
#11

Re: JPG (oder JPEG) und Kommentar oder Exif-Daten

  Alt 9. Sep 2007, 21:09
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
Ralf Stehle
ralfstehle@yahoo.de
  Mit Zitat antworten Zitat