Exiftool und Perl

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Exiftool und Perl

      Moin!

      Hat, außer mir, schon jemand versucht, bei seinen gescannten Bildern EXIF-Daten einzufügen? Gerade wenn ich sie weitergebe finde ich es nicht unwichtig, dass ich als Urheber darin vermerkt bin und die Rechte, die mit diesem Bild verbunden sind. Für mich natürlich auch die Aufnahmedaten und der Ort undsoweiter.

      Ich versuche, ein kleines Perl-Script zu schreiben, um die Daten einzufügen. Setze ich meine Namen als Artist ein, dann funktioniert es wunderbar. Setze ich ihn als Creator ein, dann erscheint er mehrfach in diesem Feld, unabhängig was davor und danach geschrieben wird.

      Anbei ein Minimalbeispiel meinens Scripts.

      Hat jemand eine Idee, wie ich es schaffe, nur einen Creator zu schreiben?

      Grüße,

      Alexander

      ------%<

      #!/usr/bin/perl

      use strict;
      use warnings;
      use Image::ExifTool;

      my $dir = '.';
      my @files;
      my $success;
      my $name = 'Alexander Schäfer';

      opendir(IN,$dir) or die "Cannot open directory $dir: $!"; # Verzeichnis öffnen
      @files = grep {/\.JPG|\.jpg|\.NEF|\.nef/} readdir(IN); # jpg und nef lesen

      my $exifTool = Image::ExifTool->new;

      foreach (@files) {

      print "$_: ";
      $exifTool->SetNewValue(Artist => $name);
      $exifTool->SetNewValue(Creator => $name);

      $success = $exifTool->WriteInfo($_); # EXIF-Daten schreiben
      print "$success\n";
      };

      closedir(IN);


      -----%<
    • Was meinst du mit "mehrfach"?

      Hast du es mal mit einer Datei direkt an der Konsole probiert?

      Und wie kontrollierst du? Vorschau auf dem Mac zeigt bei "Ersteller" nämlich z.B. den Wert für Künstler an.

      PS: Was machst du überhaupt mit den Scanns? Importierst du sie z.B. mit Lightroom? Dann kann LR dir die Cpyrightinfos schon beim Import dazu packen. Und wenn du mit VueScan scannst, kann man dort auch schon das Copyright angeben.
    • Versuchs mal mit ner eigenen Variablen für den Creator=>$Creator_name
      hilft vielleicht. Habe kein Perl, aber eigentlich ist das klar.
      Gruß
      Michael
      ------------------------------------------------------------------
      Mr. Adams, have you taken the perfect foto?
      No, it's around the corner. :D
      ------------------------------------------------------------------
      Fotos auf Flickr
    • Michael Kusch schrieb:

      Versuchs mal mit ner eigenen Variablen für den Creator=>$Creator_name
      hilft vielleicht. Habe kein Perl, aber eigentlich ist das klar.
      Ein Versuch wäre es Wert.
      Aber: Auch wenn ich keine Perl Experte bin, wieso ist das klar? In anderen Programmiersprachen müsste man auch nicht mehrere Variablen anlegen, nur um unterschiedliche Properties mit dem selben Wert zu setzen.
    • Andreas Oelpke schrieb:

      Auch wenn ich keine Perl Experte bin, wieso ist das klar? In anderen Programmiersprachen müsste man auch nicht mehrere Variablen anlegen, nur um unterschiedliche Properties mit dem selben Wert zu setzen.
      Ich habe auch kein Perl.
      Das Klar bezieht sich auf die Anweisungen im Quelltext.
      Wobei noch die Frage aufkommt warum
      $exiftool () bei jedem Durchlauf der Loop neu gebildet wird.
      Einmal sollte reichen. Soweit ich weis ist Perl eine Interpretersprache, wenn da ein Bug ist....... Soll es ja alles geben.
      Gruß
      Michael
      ------------------------------------------------------------------
      Mr. Adams, have you taken the perfect foto?
      No, it's around the corner. :D
      ------------------------------------------------------------------
      Fotos auf Flickr
    • Die Instanz von Exiftool wird vor dem Eintritt in die foreach-Schleife erzeugt.

      Aber mal eine blöde Frage: Wo wird den beim Schleifendurchlauf die jeweilige Datei zugewiesen?

      In Pseudo Code müsste das doch in etwa so aussehen, oder?

      var myName = "Andreas";
      var exifTool = new ExifTool();

      foreach(file in files)
      {
      exifTool.setCurrentFile = file;
      // oder so
      exifTool.LoadFile(file);
      exifTool.setCreateor = myName;
      exifTool.setArtist = myName;
      exifTool.Save();
      }
    • Hallo Alexander

      "artist" is ein standard Tag, es kann nur einmal existieren. (sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html)
      "creator" ist kein standard Tag, es wird daher zu einem "list type" custom Tag, und kann mehrmals gesetzt werden. die Liste wird dann jeweils erweitert.

      In deinem Code initialisierst du exiftool ausserhalb der Schleife über die Dateien.

      my $exifTool = Image::ExifTool->new;

      Die Tags setzt du aber innerhalb der Schleife und dies immer wieder für diese einzige Instanz des exifTools.

      foreach (@files) {

      $exifTool->SetNewValue(Artist => $name);

      $exifTool->SetNewValue(Creator => $name);

      ...
      }


      Damit wird das "Creator" Tag bei jeder Schleife um einen (immer gleichen) Eintrag in der Liste erweitert. Die meisten Programme zeigen das dann als einen Wert an mit den Listeneinträgen durch ein Leerzeichen getrennt.
      Das "Artist" Tag is jedoch keine Liste und es erlaubt nur einen Eintrag. Diesen überschreibst du jedesmal, es bleibt aber ein einziger Eintrag.

      Lösung: setze die Tag values ausserhalb der Schleife

      my $exifTool = Image::ExifTool->new;

      $exifTool->SetNewValue(Artist => $name);

      $exifTool->SetNewValue(Creator => $name);

      foreach (@files) {
      ...
      }



      Ich hoffe es klappt so, ich habs nicht ausprobiert. Ich setze exif mit der (batch) funktion von irfanview.

      Peter
    • Moin!

      Andreas Oelpke schrieb:

      Aber mal eine blöde Frage: Wo wird den beim Schleifendurchlauf die jeweilige Datei zugewiesen?

      Diese Frage kann ich ganz einfach beantworten.

      @files ist die Liste der Dateinamen. Die foreach-Schleife wird für jedes Element der Liste abgearbeitet und dieses wird in $_ abgelegt. Das ist eines der Konstrukte, die Perl so pipieinfach zu programmieren machen und so wahnsinnig unübersichtlich zu lesen. Zumindest, wenn man, so wie ich, nicht mehr als 0,13 Perlskripte pro Jahr geschrieben bekommt.

      Grüße,

      Alexander
    • Hallo Peter,

      Peter Schulze schrieb:

      Lösung: setze die Tag values ausserhalb der Schleife

      my $exifTool = Image::ExifTool->new;

      $exifTool->SetNewValue(Artist => $name);

      $exifTool->SetNewValue(Creator => $name);

      foreach (@files) {
      ...
      }

      Vielen Dank, das klingt plausibel. Die objektorientierte Gedankenwelt überschreitet meinen Intellekt bei weitem. Morgen, wenn ich Feiermorgen habe, werde ich es gleich ausprobieren und berichten.

      Grüße,

      Alexander
    • Alexander Schäfer schrieb:

      Moin!

      Andreas Oelpke schrieb:

      Aber mal eine blöde Frage: Wo wird den beim Schleifendurchlauf die jeweilige Datei zugewiesen?
      Diese Frage kann ich ganz einfach beantworten.

      @files ist die Liste der Dateinamen. Die foreach-Schleife wird für jedes Element der Liste abgearbeitet und dieses wird in $_ abgelegt. Das ist eines der Konstrukte, die Perl so pipieinfach zu programmieren machen und so wahnsinnig unübersichtlich zu lesen. Zumindest, wenn man, so wie ich, nicht mehr als 0,13 Perlskripte pro Jahr geschrieben bekommt.

      Grüße,

      Alexander
      Danke.
      Und woher weiß die Instanz von exifTool dann, dass $_ "seine" aktuelle Datei ist?

      Ich komme aus der C++ und C# Welt und finde es seltsam, wenn da so Variablen scheinbar hinterrücks Objekten zugewiesen werden, ohne dass ich als Entwickler was machen muss.


      PS: Habe gerade nochmal ein bisschen "geforscht". Könnte es sein dass man in der Schliefe erst
      my $info = $exifTool->ImageInfo($_);
      aufrufen muss, damit es klappt?
    • Hallo Peter,

      danke für Deinen Hinweis. Wenn ich außerhalb der Schleife initialisiere und die Tags außerhalb der Schleife setzte, dann funktioniert es.

      Andreas, wahrscheinlich funktionert es genauso, wenn ich beides in der Schleife tue. Man kann mit Perl gruselig unlesbare Programme schreiben, die trotzdem toll funktionieren. Wenn ich mich recht erinnere gibt es sogar Wettbewerbe um das unverständlichste Programm.

      Vielen Dank für Eure Hilfe.

      Grüße,

      Alexander
    • Hallo Alexander,

      magst du das komplette, funktionierende Script hier mal posten. So für alle als Tipp und Lösung.

      Danke!

      Durch Dich angeregt, habe ich auch noch mal ein bisschen mit ExifTool und Perl rumexperimentiert. Bei mir stimmt aber irgendetwas mit den Include Pfaden nicht. Habe aber gerade aber auch nicht genug Muße, dem nachzugehen.

      Gruß
      Andreas