Exif bzw. IPTC

Rund um die LCL und andere Komponenten
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Exif bzw. IPTC

Beitrag von MitjaStachowiak »

So, hier ist mal ein erster Prototyp: https://mitjastachowiak.de/?/projects/s ... index.html

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

Re: Exif bzw. IPTC

Beitrag von wp_xyz »

Eine schöne Seite hast du da! Und der SlideshowCreator wird sicher interessant (momentan hat er noch ein paar Macken).

Zurück zu den Speicherlecks: Ich habe auf die schnelle ein kleines Programm geschrieben, das mir ein paar EXIF-Tag ausgibt, das hat keine Speicherleck, aber das DExView aus dem demo-Ordner massiv. Zunächst hat der Autor vergessen, die im FormCreate erzeugten Klassen wieder freizugeben (ImgData und fList), aber nachdem ich das behoben hatte, meldet HeapTrc immer noch eine Menge. Vorübergehend hatte ich die TTagEntrys im Verdacht, die du von Record auf Object umklassiert hast, aber auch mit der Version vor deiner Änderung tritt das Speicherleck auf. Momentan schreckt mich der chaotische Code davon ab, tiefer in dieses Package einzusteigen... Falls du zufällig auf die Ursache stoßen solltest, wäre es schön, wenn du die gefixte Unit hier posten würdest.

Zur Frage mit den Kommentaren: Ich weiß nicht recht, ich habe das Gefühl, das ist nicht standardisiert, und da kocht jeder sein eigenes Süppchen. Ich habe mit Zoner Photo Studio zu einem Foto einen Kommentar eingegeben, der wird aber von IrfanView nicht angezeigt.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Exif bzw. IPTC

Beitrag von MitjaStachowiak »

Schick' mal dein Code. Zumindest die Methoden, die ich so verwende, sind frei von Lecks. Die Änderung von Record in Object hätte ich mir sparen können. Ich wollte etwas Redundanz aus dem Ganzen herausnehmen: In dem TTagEntry werden sowohl die Rohdaten, als auch die verarbeiteten Daten und die Größe des Rohdatenstrings gespeichert. Man kann also nicht einen Wert ändern, ohne an 5 anderen Stellen auch etwas ändern zu müssen. Daher wollte ich das in Object ändern, um etwa die Size-Variable durch ein Property zu ersetzen, dass wirklich immer die echte Größe ausgibt. Aber das IPTC-Packet benutzt diese Variable anscheinend gezielt abweichend von der echten Größe... Habe es also erst mal so gelassen. Der gesamte Exif-Block wird parallel zu den TTagEntries noch mal gespeichert und im TagEntry gibt es Pointer dorthin. Vor meinen Änderungen war es offenbar nicht möglich, die Länge einer Variable zu ändern. Man konnte nur den Datenblock überschreiben.

Der EXIF-Standard wird hier ganz gut erklärt: http://www.media.mit.edu/pia/Research/d ... /exif.html
Was die Seite nicht so wirklich erwähnt: Der Sub-IFD ist nicht ein normaler Datenblock mit IFD-Inhalt, sondern es muss der erste Datenblock im Datenbereich sein; die Offset-Pointer in den Sub-IFDs referenzieren nicht etwa vom Start der Sub-IFDs sondern vom Start des Parent-IFD. Das ist einfach total bescheuert, da man einen IFD so nicht einfach für sich genommen betrachten darf, sondern immer die offsetBias, die die Position im Parent-IFD speichert, mit übergeben muss. Zum Erstellen der Ausgabe ist das ein Graus. Und natürlich ist die Endianness nicht vorgegeben. Das ist beim einlesen ein echtes Ärgernis. Wieso der UserComment von meinem Programm nicht will, weiß ich noch nicht.

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

Re: Exif bzw. IPTC

Beitrag von wp_xyz »

Die Programme, die die Speicherlecks erzeugen, sind in dem zip enthalten, das ich hier etwas weiter oben gepostet habe, Ordner "demo", speziell das Projekt "DExView". Es handelt sich um Demos, die in dem Originalpacket von Gerry McGuire enthalten waren und die ich höchstens geringfügig verändert habe, um sie unter Lazarus übersetzen zu können.

Wiegesagt, es fehlt ein FormDestroy mit

Code: Alles auswählen

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ImgData.Free;
  fList.Free;
end;

Auch in dem Programm, für das ich damals dEXIF nach Lazarus übertragen hatte, gibt es kein Speicherleck. Das Problem scheint mit einem bestimmten EXIF-Tag zusammenzuhängen (intuitiv würde ich auf das EXIF-Vorschaubild tippen - aber das ist nur ins Blaue hinein geraten).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Exif bzw. IPTC

Beitrag von Christian »

W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Exif bzw. IPTC

Beitrag von MitjaStachowiak »

Ist das auf GitHub die offizielle Version?
Meine Änderungen sind jedenfalls public domain, darf gerne ergänzt werden :idea:

Jedenfalls habe ich das Problem mit dem UserComment gelöst, der musste im Sub-IFD stehen, meine vorherige Implementierung war fehlerhaft, weil der Sub-IFD offenbar doch kein Datenblock ist, sondern ein spezieller Buffer, der zwischen Main-IFD und dessen Datenbereich steht. Das Tag Exif-Offset ist also kein Daten-Tag im Sinne des Exif Standards, sondern ein unsigned integer, der auf den Beginn des Sub-IDF zeigt. :roll:

Strenggenommen haben die Standard-Tags auch alle fest definierte Positionen und Reihenfolgen, aber das ist Platzverschwendung, es geht jetzt anscheinend so, wie ich's gemacht habe: https://mitjastachowiak.de/projects/slideshowcreator/

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

Re: Exif bzw. IPTC

Beitrag von wp_xyz »

Eine "offizielle" Version von dExif gibt es meines Wissens nicht. Ich kannte Christian's Port noch nicht. Hat den Vorteil gegenüber meinem, dass LCL nicht benötigt wird. Ich konnte allerdings damit das Demo-Programm mit dem Memory-Leck nicht testen, weil in dieser Version die Unit jpeg bzw. graphics bei Lazarus nicht eingebunden ist.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: Exif bzw. IPTC

Beitrag von af0815 »

Zum Thema Christians Port auf Github, ich habe mir den gezogen und auch den Originalauthor angeschrieben:

Code: Alles auswählen

Hello Andreas ,
  It is possible, all I ask is attribution somewhere in your documentation or source.  I will indeed look at updating the license terms but wanted to let you know it's OK to proceed so you don't have to wait.
 
Thanks,   
 
Gerry McGuire dEXIF author.
 
From: Frieß <friess@xxxx.yyy>
Sent: Wednesday, July 19, 2017 5:12 AM
To: mcguirez@xxxxx.zzz
Subject: License of dEXIF
 
Hallo,
 
dEXIF is Copyright © 2001 - 2006 Gerry McGuire. All rights reserved.
 
-> Is it possible to change the sourcecode for running on other
pascal-compiler (fpc) for me/us without copyright violence ?
-> It is so long time gone, it is possible for you to give a more common
license like LGPL, so it can be bundled with sourcecode libraries ?
 
Yours sincerly
 
Andreas Frieß
Austria
 


Damit ist der Port auch vom Original Author abgesegnet :-)

Andreas

BTW: Ich verwende aktuell auch diesen Port deswegen die 'offizielle' Anfrage
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

diogenes
Beiträge: 200
Registriert: So 11. Jul 2010, 18:39
OS, Lazarus, FPC: Linux
CPU-Target: 64 Bit
Wohnort: Wien
Kontaktdaten:

Re: Exif bzw. IPTC

Beitrag von diogenes »

dEXIF ist interessant für mich, nur: Wie benutzt man das? Bitte mich nicht mit diesem Beispielprogramm abzuspeisen. Ich will auslesen, welcxe Tags es gibt und welchen Wert sie haben. Ist das möglich? Wenn ja, wie?
Ceterum censeo computatores per Pascal docendos esse.

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

Re: Exif bzw. IPTC

Beitrag von wp_xyz »

Wenn du die Datei dExif.pas öffnest (z.B. https://github.com/cutec-chris/dexif/bl ... /dEXIF.pas) und etwas runterscrollst, Zeile 468, beginnt eine TagTable, darunter gibt es noch eine GPSTable. Um die Tags auszulesen, musst du die Beispiel-Programme, die im Original-Paket enthalten sind (allerdings nicht in Christians Port), studieren; es gibt aber auch eine Kurzanleitung "ProgrammerGuide.txt".

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Exif bzw. IPTC

Beitrag von MitjaStachowiak »

Also ich habe in meinem Programm 'ne Menge an dem EXIF-Parser geändert; würde sagen das Parsing generalüberholt sowie einen EXIF-Writer hinzugefügt. Es war in der ursprünglichen Version glaube ich nicht möglich, Tags hinzuzufügen oder deren Länge zu ändern. Dazu weitere Bugs auch mit ANSI/UTF16 etc. Ich empfehle daher, mit meiner Version, die in diesem Programm steckt: https://mitjastachowiak.de/?/projects/s ... index.html, weiterzuarbeiten, habe im Moment aber keine Zeit, die Änderungen genauer zu dokumentieren. Aber ihr erkennt meinen Code an der 1-Leerzeichen-Einrückung :mrgreen:

diogenes
Beiträge: 200
Registriert: So 11. Jul 2010, 18:39
OS, Lazarus, FPC: Linux
CPU-Target: 64 Bit
Wohnort: Wien
Kontaktdaten:

Re: Exif bzw. IPTC

Beitrag von diogenes »

Danke, ich werd' mir das anschauen
Ceterum censeo computatores per Pascal docendos esse.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: Exif bzw. IPTC

Beitrag von af0815 »

Die Version von Mitja liegt jetzt auch hier https://github.com/afriess/dexif/tree/Mitja_Version !! Wenn man will so kann man das ja dann in die Version von Chris einpflegen. Mit GIT sieht man halt die Unterschiede besser, DIFF sei dank.

@diogens: Falls du Beispiele hast/erstellst, bitte mir senden, dann kann man die hier einpflegen.

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

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

Re: Exif bzw. IPTC

Beitrag von wp_xyz »

Es gibt in diesem Thread drei verschiedene Versionen mit jeweils Vor- und Nachteilen:

  • meine (siehe mein Post vom 26.6.2016 weiter oben):
    + unterstützt Jpeg-Vorschaubild
    - benötigt LCL
    - Speicherleck, wahrscheinlich im Zusammenhang mit Vorschaubild
  • Mijas Version (jetzt auch in Andreas' github)
    + diverse Erweiterungen gegenüber meiner
    - benötigt LCL
    - Package fehlerhaft und kann nicht kompiliert werden.
    - Jpeg-Vorschaubild per IFDEF deaktiviert (da ich den Compilierungsfehlern nicht nachgegangen bin, konnte ich das nicht testen - vielleicht geht's ja doch).
  • Christians Version
    + ohne LCL
    - ohne Jpeg-Vorschaubild
    - ohne Mitjas Erweiterungen
Freiwillge vor: Es wäre doch gut, wenn die drei Versionen zusammengeführt und über den Online-Package-Manager allgemein verfügbar wären.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: Exif bzw. IPTC

Beitrag von af0815 »

Ok, dann hole ich mal die 3te Version auch noch in den GIT.

Done: https://github.com/afriess/dexif/tree/WP_XYZ_Version

Edir: Mitja Version lässt sich jetzt auch als Paket kompilieren
Edit: Alle Versionen jetzt am GIT

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

Antworten