AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi JPG (oder JPEG) und Kommentar oder Exif-Daten
Thema durchsuchen
Ansicht
Themen-Optionen

JPG (oder JPEG) und Kommentar oder Exif-Daten

Ein Thema von Ralf Stehle · begonnen am 5. Sep 2007 · letzter Beitrag vom 30. Sep 2007
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz