fpExif: Wie fügt man richtig EXIF hinzu bei jpg

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

fpExif: Wie fügt man richtig EXIF hinzu bei jpg

Beitrag von af0815 »

Ich würde gerne bei jpg Bildern die keine EXIF Daten haben, diese Daten hinzufügen.

In den Beispielen von fpEXIF ist erklärt, wie man die lädt und ändert, aber nicht wie man das ganze von Null weg hochzieht. Muss ich da jedes Tag einzeln in der Struktur neu anlegen oder ?

Wie bekomme die Standard (=Bekannten) Tage heraus, wie zB. "EXIF.Serialnumber" ich habe begriffen, das ein "Serialnumber" nicht funktioniert, sondern das EXIF voranstehen muss. Aber wie komme ich zu den Tagnamen, wenn selbst welche vergeben muss ?

Anbei ein Beispiel, das einen Tag erstellen kann, das jpg wird über CreateJPEG erstellt, über ReadEXIF, sieht man das es kein EXIF in dem jpg gibt. Mit CreateEXIF wird der EXIF erstellt und ein Tag. Beim nächsten Versuch, wird das Tag dann mit anderen Inhalt versehen.
Ist das alles so richtig ? Was mir abgeht dabei ist ein

AddOrReplaceTagByName(AFullTagName:string):TTag; weil ein AddTagByName(AFullTagName:string):TTag; gibt es ja auch. Damit kann ich ja bei leeren EXIF ein Tag einfach einfügen.

Code: Alles auswählen

          FImgInfo.CreateExifData;
          FImgInfo.ExifData.AddTagByName('EXIF.SerialNumber').AsString:= '0987654321';
und wenn

Code: Alles auswählen

          FImgInfo.ExifData.AddOrReplaceTagByName('EXIF.SerialNumber').AsString:= '0987654321';
auch geht, so kann man einen Tag ändern oder erstellen lassen, in einem AUfwaschen.

Oder übersehe ich da was ?
Dateianhänge
jpegfpexif.zip
(140.23 KiB) 27-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 258
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: fpExif: Wie fügt man richtig EXIF hinzu bei jpg

Beitrag von h-elsner »

wp_XYZ als Maintainer von FPEXIF kann sicherlich mehr dazu sagen. Ich versuche aber trotzdem mal, ein paar Gedanken zu äußern. Ich benutze FPEXIF zum taggen von Bildern, die von einem Multikopter aufgenommen wurden und versuche, Geotagging aus Flightlog Daten zu machen. Deshalb ist das was ich mache sehr begrenzt.

Mir ist nicht klar, was du willst. Ich denke du suchst erstens eine Art Template, das beim Erstellen neuer EXIF Daten alle als 'mantadory' gekennzeichneten Tags erzeugt. Das wird es wohl nicht geben, denn die meisten dieser Daten 'kennt' nur die Kamera.
Ich hatte immer nur Hersteller, Modell, 'DateTimeOriginal' und 'DateTime' genommen. Das schien augereicht zu haben, lesbare EXIF Daten zu erzeugen, die ich dann mit anderen gewünschten Tags ergänzt habe (Geodaten). Und ja, jeder Tag wurde einzeln erzeugt.
Die gültigen EXIF Tags hatte ich von hier genommen: https://exiftool.org/TagNames/EXIF.html

Zweitens: Wolltest du eigene EXIF Tags definieren? Darf man das überhaupt. Ich dachte man kann nur die in der EXIF Doku gelisteten Tags nehmen. Ich habe gesehen, dass für selbst definierte Tags XMP Daten benutzt werden, z.B. für Kameragimbal Daten wie Ausrichtung, Neigungswinkel usw. Mein Annahme war, dass die XMP Daten aufnehmen, weil eben EXIF so etwas nicht definiert hat.

Drittens: So etwas wie AddOrReplaceTagByName(AFullTagName:string):TTag; musste du eben selber schreiben, wenn es das noch nicht gibt. Oder wp_XYZ nimmt das als Auftrag :D

Ich hatte mir eine Sammlung von Routinen für meine begrenzten Zwecke geschrieben. Sicherlich kann man vieles eleganter lösen, aber das was ich wollte ging damit. Vielleicht hilft es als Anregung.
exifstuff_pas.zip
(2.79 KiB) 30-mal heruntergeladen
Gruß HE

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpExif: Wie fügt man richtig EXIF hinzu bei jpg

Beitrag von af0815 »

Ich habe Bilder aus einer GoPro9 über Wifi (ist ein anonymer Stream), das absolut keine EXIF Daten hat. Also bin ich gezwungen einen Stamm an Daten zu erzeugen wenn ich EXIF haben will. Die Kamera kennt zwar alles, liefert mir aber nur die reinen jpeg Daten. Bei der GoPro11 mit letzten Update (das ist wichtig) werden mir eine Menge an EXIF Daten im übertragenen Stream mitgeliefert.

So wie komme ich an die populären (=häufig und standardmässig verwendeten) Tags bzw. deren Namen. Ich will nichts erfinden, sondern nur 'normale' Tags verwenden. Ich bin/war mir nicht sicher ob beim erstellen des 'Basis' EXIF nicht ein paar 'Standards' mit erzeugt werden. SO wie es aussieht nicht.

Vor allen, was bezeichnest du als EXIF Doku ? Das verlinke ist auch nur die Doku zu einem Programm/Tool. Dort werden anonyme Tags verwendet, ich finde da nicht unbedingt das, was ich hier unter Tag direkt eingeben kann.

Ich bin bezüglich fpEXIF ein kompletter Laie, deswegen auch die Fragen.

Als Zusatzinfo, es geht in einem (Hintergrunds-)Thread ohne Probleme mit fpExif und scheinbar schneller als mit dExif.

Und AddOrReplaceTagByName(AFullTagName:string):TTag; ist ganz einfach einfach, gerade wenn man den EXIF Sch... selbst erzeugen muss, dann sollte man aber die TagNamen aber kennen. Deswegen auch die Nachfrage hier. Allgemein würde ich Verbesserungen dann an die Community (fpEXIF) zurückgeben.

Bis jetzt hat mich echt abgestossen, das fpExif im CCR eingekerkert ist. Daher das man es nicht extra für Änderungen monitoren kann, bzw. als eigenständig auschecken kann. Und ich hasse es den ganzen unübersichtlichen CCR lokal liegen zu haben. Und Snapshoots nur nur vom fpExif sind auch nicht prickelnd, weil du nichts vernünftig nachverfolgen kannst. Ist aber eine persönliche SIchtweise.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: fpExif: Wie fügt man richtig EXIF hinzu bei jpg

Beitrag von wp_xyz »

af0815 hat geschrieben:
Do 23. Mär 2023, 15:51
In den Beispielen von fpEXIF ist erklärt, wie man die lädt und ändert, aber nicht wie man das ganze von Null weg hochzieht. Muss ich da jedes Tag einzeln in der Struktur neu anlegen oder ?
Beispiele dafür gibt es in den Unit-Tests: z.B. tests\unittest\common\fetExifLE.pas, procedure WriteExifTest_Jpeg.pas (die Check*-Routinen des Tests habe ich im folgenden rausgelöscht):

Code: Alles auswählen

procedure TstExifLE.WriteExifTest_Jpeg;
var
  imgInfo: TImgInfo;
  lTag: TTag;
begin
  imgInfo := TImgInfo.Create;
  try
    // Create empty EXIF
    imgInfo.CreateExifData;

    // Add tags
    lTag := imgInfo.ExifData.AddTagByName('Primary.DocumentName');
    lTag.AsString := 'Test image';

    lTag := imgInfo.ExifData.AddTagByName('ImageDescription');
    lTag.AsString := 'This is just a test image';

    lTag := imgInfo.ExifData.AddTagByName('Orientation');
    lTag.AsString := 'Horizontal (normal)';

    lTag := imgInfo.ExifData.AddTagByName('XResolution');
    lTag.AsInteger := 72;

    lTag := imgInfo.ExifData.AddTagByName('YResolution');
    lTag.AsInteger := 72;

    lTag := imgInfo.ExifData.AddTagByName('ResolutionUnit');
    ltag.AsString := 'inches';

    lTag := imgInfo.ExifData.AddTagByName('Software');
    lTag.AsString := 'FPC/fpExif';

    lTag := imgInfo.ExifData.AddTagByName('DateTime');
    TDateTimeTag(lTag).AsDateTime := EncodeDate(2017,10,14) + EncodeTime(23,35,07,0);

    lTag := imgInfo.ExifData.AddTagByName('ExifVersion');
    TVersionTag(lTag).AsString := '0210';

    lTag := imgInfo.ExifData.AddTagByName('ExifImageWidth');
    lTag.AsInteger := 200;

    lTag := imgInfo.ExifData.AddTagByName('ExifImageHeight');
    lTag.AsInteger := 150;

    // Save to file;
    // Takes the image data from WorkFile_WithExif, replaces its EXIF with the
    // current EXIF structure and writes to WorkFile_NoExif.
    imgInfo.SaveToFile(WorkFile_NoExif, Workfile_JpegWithExif);
  finally
    imgInfo.Free;
  end;
af0815 hat geschrieben:
Do 23. Mär 2023, 15:51
Wie bekomme die Standard (=Bekannten) Tage heraus, wie zB. "EXIF.Serialnumber" ich habe begriffen, das ein "Serialnumber" nicht funktioniert, sondern das EXIF voranstehen muss. Aber wie komme ich zu den Tagnamen, wenn selbst welche vergeben muss ?
Ja, die von h-elsner angegebenen Referenz von exiftool ist eine gute Stelle. Ansonsten bleibt nur der Blick in den Quellcode: Unit fpeExifData, procedure BuildExifTagDefs, listet die der Unit bekannten Tags. Wie oben einfach im Beispiel die Strings in AddTagByName verwenden. Manche Namen gibt es mehrfach, dann muss man den vollen Namen des "Ordners" durch Punkt getrennt voranstellen. Oder man nimmt im ersten Parameter der Build Prozedur angegebene Tag-ID in AddTagByID zu nehmen; die ID muss im High-Word auch die ID des Parent-Verzeichnisses enthalten, also genauso wie in BuildExifTagDefs, z.B. für das "ImageWidth"-Tag im Primary Segment TAGPARENT_PRIMARY + $0100, oder im EXIF-Segment TAGPARENT_EXIF + $0100. Die erlaubten TAGPARENT-IDs stehen in Unit fpeTags.

Sorry, wenn das etwas ins Detail geht, aber nach dem Abtippen von hunderten von TagIDs hatte ich keine Lust mehr, das in einer Dokumentation zu wiederholen, zumal es auf der exiftool-Seite schon eine gute Seite mit derselben Seite gibt.
af0815 hat geschrieben:
Do 23. Mär 2023, 15:51

Code: Alles auswählen

AddOrReplaceTagByName(AFullTagName:string):TTag; 
gibt es nicht. Du musst zuerst das Tag suchen (IndexOfTagID oder IndexOfTagName) und kannst dann das Tag ändern bzw. per Add* neu einfügen. Aber AddOrReplaceTagByName (und ByID) ist natürlich eine gute Idee - vielleich baue ich das demnächst noch ein.

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: fpExif: Wie fügt man richtig EXIF hinzu bei jpg

Beitrag von wp_xyz »

af0815 hat geschrieben:
Do 23. Mär 2023, 22:38
Bis jetzt hat mich echt abgestossen, das fpExif im CCR eingekerkert ist. Daher das man es nicht extra für Änderungen monitoren kann, bzw. als eigenständig auschecken kann. Und ich hasse es den ganzen unübersichtlichen CCR lokal liegen zu haben. Und Snapshoots nur nur vom fpExif sind auch nicht prickelnd, weil du nichts vernünftig nachverfolgen kannst. Ist aber eine persönliche SIchtweise.
Aber das ganze CCR läuft doch unter svn - ok, ist nicht so "hip" wie git -, aber du kannst problemlos einen Teil des CCR-Ordners auschecken und die Entwicklung verfolgen

Code: Alles auswählen

 svn checkout svn://svn.code.sf.net/p/lazarus-ccr/svn/components/fpexif .

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 258
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: fpExif: Wie fügt man richtig EXIF hinzu bei jpg

Beitrag von h-elsner »

Mit EXIF Doku meine ich den Link oben in der EXIF Tool Seite:
See https://web.archive.org/web/20190624045 ... 2019-E.pdf for the official EXIF 2.32 specification.
Ich habe versucht diese Doku zu verstehen, bin aber zu dem Schluß gekommen, dass Japaner anders denken als ich.

Gruß HE

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpExif: Wie fügt man richtig EXIF hinzu bei jpg

Beitrag von af0815 »

wp_xyz hat geschrieben:
Do 23. Mär 2023, 22:52
Aber das ganze CCR läuft doch unter svn - ok, ist nicht so "hip" wie git -, aber du kannst problemlos einen Teil des CCR-Ordners auschecken und die Entwicklung verfolgen
Wie gesagt, ist persönlich. Ich habe mich für GIT alleine entschieden und SVN aufgegeben. Damit habe ich auch keine 2 Schwergewichtigen Prozesse im Hintergrund (TortuiseGIT und TortoiseSVN) die die Festplatte monitoren und cachen. Wenn, dann nur ein System. Aber ich schau mir das an.

Danke für die Hinweise und Erklärungen.
Ansonsten bleibt nur der Blick in den Quellcode: Unit fpeExifData, procedure BuildExifTagDefs, listet die der Unit bekannten Tags. Wie oben einfach im Beispiel die Strings in AddTagByName verwenden. Manche Namen gibt es mehrfach, dann muss man den vollen Namen des "Ordners" durch Punkt getrennt voranstellen. Oder man nimmt im ersten Parameter der Build Prozedur angegebene Tag-ID in AddTagByID zu nehmen; die ID muss im High-Word auch die ID des Parent-Verzeichnisses enthalten, also genauso wie in BuildExifTagDefs, z.B. für das "ImageWidth"-Tag im Primary Segment TAGPARENT_PRIMARY + $0100, oder im EXIF-Segment TAGPARENT_EXIF + $0100. Die erlaubten TAGPARENT-IDs stehen in Unit fpeTags.
Genau das mit den 'manche Namen gibt es mehrfach' das hat mich verwirrt, weil ich im Demo das gesehen habe, das der Namen zB. EXIF.Irgendwas enthalten hat. Mal sehen ob ich das kapiere. Danke nochmals.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: fpExif: Wie fügt man richtig EXIF hinzu bei jpg

Beitrag von Socke »

af0815 hat geschrieben:
Fr 24. Mär 2023, 08:21
Wie gesagt, ist persönlich. Ich habe mich für GIT alleine entschieden und SVN aufgegeben. Damit habe ich auch keine 2 Schwergewichtigen Prozesse im Hintergrund (TortuiseGIT und TortoiseSVN) die die Festplatte monitoren und cachen. Wenn, dann nur ein System. Aber ich schau mir das an.
TortoiseGit kann doch auch mit SVN umgehen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

wp_xyz
Beiträge: 4864
Registriert: Fr 8. Apr 2011, 09:01

Re: fpExif: Wie fügt man richtig EXIF hinzu bei jpg

Beitrag von wp_xyz »

fpexif hat jetzt Methoden TExifData.AddOrReplaceTagByID und ...ByName. Siehe beigefügtes Mini-Projekt als Beispiel, bei dem einem "exif-freien" Beispielbild in einem ersten Schritt Exif-Daten hinzugefügt und dann in einem zweiten Schritt mit AddOrReplaceTagByName ergänzt bzw. verändert werden.
Dateianhänge
fpexif_addorreplace.zip
(6.08 KiB) 32-mal heruntergeladen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpExif: Wie fügt man richtig EXIF hinzu bei jpg

Beitrag von af0815 »

Danke.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten