lesen und schreiben von IPTC-Daten

Hallo in die Runde,
seit Jahren nutze ich Image Info um IPTD-Daten aus Bildern auszulesen. Leider wird das schon lange nicht mehr gepflegt und luft nicht mit Xojo :frowning:
Ich mchte auf die Nutztung von IPTC aber nicht verzeichten und bin deshalb noch bei REALStudio geblieben (obwohl ich eine Xojo-Lizenz habe).

Jetzt wird es langsam Zeit, das Problem anzugehen.

Kennt jemand ein Tool/eine Klasse/ein Plugin oder Code, mit dem ich IPTC-Daten aus Bildern zumindes auslesen kann?

Gibt es eine gute, leicht verstndliche Doku zu IPTC (am liebsten in deutsch)? Alles, was ich gefunden habe, war meist sehr umfangreich.
Mir reicht es ein paar wesentliche Informationen auslesen zu knnen (Objektbeschreibung, Autor, berschrift, Titel, evt. noch Stichworte)

Gru, Stefan Mettenbrink.

Das sollte mit den Classes for Adobe Extensible Metadata Platform (XMP) der MBS-Plugins gehen. Allerdings sind die kostenpflichtig.
Schau mal hier: http://www.monkeybreadsoftware.net/pluginpart-xmp.shtml

Ich benutze das “exiftool” unter Windows und Mac OS X:

Sub ShowExifData(PictureFile as FolderItem)
if PictureFile <> nil then

dim ExifShell as new shell
dim cmd as string
dim LangOpt as string
dim ExecFolder as FolderItem
ExecFolder = GetFolderItem("")

if OSLang = "de" then
  LangOpt = " -lang de "
else
  LangOpt = ""
end if

#if TargetWin32 then
  cmd = chr(34) + App.ExecutableFile.Parent.Child("exiftool.exe").NativePath + chr(34) + " -n -a " + LangOpt + " " + chr(34) + PictureFile.NativePath + chr(34)
#endif

if DebugBuild then
  dim MyClip as new Clipboard
  MyClip.Text = cmd
end if

#if TargetMacOS then
  cmd = "exiftool" + " -n -a " + LangOpt + "'" + PictureFile.NativePath + "'"
#endif

LabelTitle.Text = PictureFile.DisplayName

ExifShell.Execute(cmd)
dim ExifReturn as string
ExifReturn = DefineEncoding(ExifShell.Result,Encodings.UTF8)
dim LinesArray(-1) as string
LinesArray = split(ExifReturn, EndOfLine)
dim LineSplit(-1) as string
dim XSize as integer
XSize = UBound(LinesArray)
dim ExifArray(-1,2) as string
redim ExifArray(XSize,2)
ListboxEXIF.DeleteAllRows

for i as integer = 0 to LinesArray.Ubound
  if DebugBuild then
    system.DebugLog("EXIF: " + LinesArray(i))
  end if
  LineSplit = split(LinesArray(i), ":")
  if LineSplit.Ubound > 0 then
    if LineSplit(0).len > 0 then
      ExifArray(i,0) = LineSplit(0)
      ListboxEXIF.AddRow(LineSplit(0))
      if LineSplit.Ubound > 0 then
        // ExifArray(i,1) = replace(LinesArray(i), LineSplit(0))
        ListboxEXIF.Cell(i,1) = replace(LinesArray(i), LineSplit(0) + ": ", "")
      end if
    end if
  end if
next

end if

GetGPSURL(PictureFile)
if TabPanel1.Value = 1 then
ContMap1.HTMLViewer1.LoadURL(URL)
end if
End Sub

Beispiel:

Die MBS-Plugins nutze ich ebenfalls. Dort finde ich aber nichts zu IPTC (zumindest nicht plattforübergreifend). Weiß jemand genaueres?

XMP Funktionen sind zwar die moderneren, aber meine Anwender nutzen seit Jahren IPTC. Da möchte ich das jetzt nicht einfach wegfallen lassen. Allenfalls ein Auslesen der IPTC-Daten und anschließendes Sichern als XMP wäre denkbar. Auch daür braucht es dann IPTC-Routinen.

Exif ist auch nicht das, was ich suche. Die angebotenen Datenfelder sind völlig andere. Exif enthält Kamera- und Belichtungsinformationen und weitere Angaben zum Standort oder Uhrzeit der Aufnahme.
Ich benötige Felder, in denen ich Zusatzbemerkungen eingeben kann (Objektbeschreibung, Überschrift, Titel, Ereignis, ggf. noch Stichwörter oder Personennamen). Die Überschrift und die Objektbeschreibung wird übrigens auch vom Finder im Infodialog zum Bild angezeigt. Die Datei lässt sich anhand eines Begriffes aus der Objektbeschreibung auch über Spotlight finden.

Wenn also noch jemand hilfreiche Informationen hat, wäre ich daran sehr interessiert!
Insbesondere, wenn ich in der Flut von Funktionen der MBS-Plugins etwas übersehen habe. Ich habe nur das XMP-Beispiel gefunden und konnte damit die IPTC-Daten nicht auslesen. Schade eigentlich :frowning:

Gruß, Stefan Mettenbrink.

die MBS XMP Funktionen machen halt XMP und nebenbei auch IPTC und EXIF.

OK, dann ist das im Beispielprojekt “Dump XMP of image file.rbp” nur nicht genutzt worden.
Dann werde ich mich in der Doku mal umsehen müssen.

Danke für den Hinweis!

Gruß, Stefan Mettenbrink.

Nochmals zur Info:
Das EXFITool kann IPTC Daten lesen, schreiben und neue erstellen.

  Meta Information
  ----------------------+----------------------+---------------------
  EXIF           r/w/c  |  CIFF           r/w  |  Ricoh RMETA    r
  GPS            r/w/c  |  AFCP           r/w  |  Picture Info   r
  IPTC           r/w/c  |  Kodak Meta     r/w  |  Adobe APP14    r
  XMP            r/w/c  |  FotoStation    r/w  |  MPF            r
  MakerNotes     r/w/c  |  PhotoMechanic  r/w  |  Stim           r

hmmm…
Für mich macht das den Eindruck eines fertigen Programms. Das ist nicht, was ich suche.
Ich suche ein Plugin, welches ich in Xojo nutzen kann um die IPTC-Daten selbst aus zu lesen und ggf. zu verändern.

Wie Christian schon schrieb, soll das mit den MBS-Plugins möglich sein. Ich werde nich vor dem Wochenende dazu kommen, mir das mal anzusehen. Wenn jemand Beispielcode hat, wäre ich daran interessiert. Bisher habe ich nur Code zum Auslesen von XMP gefunden.

Gruß, Stefan Mettenbrink.

Von dem Link: ExifTool is a platform-independent Perl library plus a command-line application for reading, writing and editing meta information in a wide variety of files.

So ein wenig Arbeit würdest Du damit schon haben.

Für mich ist der Knackpunkt, dass es nicht im Programm integriert ist. Da werde ich mich erst mal etwas näher mit den Möglichkeiten der XMP-Funktionen der MBS-Plugins beschäftigen. Da sollen ja auch IPTC-Funktionen drin sein.

Danke für den Hinweis.

Gruß, Stefan Mettenbrink.

Du kannst ExifTool in Dein Programm integrieren und mit einer Shell verwenden.

Der User bekommt so ein Shell-Tool gar nicht mit. Das wird mit einem PostBuild-Script in das Programm befördert. Da schaut kein Mensch nach. Die Shell ist auch nicht so kompliziert. Du machst einen Shell-Befehl und bekommst Daten zurück, die Du parsen mußt.

Das rein informativ. Wenn Du das nächste Mal auf ein Shell-Programm triffst.

Der User bekommt so ein Shell-Tool gar nicht mit. Das wird mit einem PostBuild-Script in das Programm befördert. Da schaut kein Mensch nach. Die Shell ist auch nicht so kompliziert. Du machst einen Shell-Befehl und bekommst Daten zurück, die Du parsen mußt.

Das rein informativ. Wenn Du das nächste Mal auf ein Shell-Programm triffst.

Danke noch mal für die Hinweise. Hört sich gar nicht so schlecht an.
Muss ich mir am Wochenende mal alles ansehen.

Nutzt das hier jemand in Xojo und hätte ein Beispiel?

Gruß, Stefan Mettenbrink.

Zuerst eine Listbox mit dem Namen “ListboxEXIF” erstellen.
ColumnCount = 2
InitialValue = EXIF DATA =>TAB VALUE

Dann eine Konstante
OSLang
Default=en
German=de
English=en

EXIF Daten lesen:

Sub ShowExifData(PictureFile as FolderItem)
if PictureFile <> nil then

dim ExifShell as new shell
dim cmd as string
dim LangOpt as string
dim ExecFolder as FolderItem
ExecFolder = GetFolderItem("")
if OSLang = "de" then
  LangOpt = " -lang de "
else
  LangOpt = ""
end if

#if TargetWin32 then
  cmd = ExecFolder.NativePath + "exiftool.exe -n -a " + LangOpt + " " + PictureFile.NativePath
#endif

#if TargetMacOS then
  cmd = "exiftool" + " -n -a " + LangOpt + "'" + PictureFile.NativePath + "'"
#endif

ExifShell.Execute(cmd)
dim ExifReturn as string

ExifReturn = DefineEncoding(ExifShell.Result,Encodings.UTF8)

dim LinesArray(-1) as string
LinesArray = split(ExifReturn, EndOfLine)
dim LineSplit(-1) as string
dim XSize as integer
XSize = UBound(LinesArray)
dim ExifArray(-1,2) as string
redim ExifArray(XSize,2)
ListboxEXIF.DeleteAllRows

for i as integer = 0 to LinesArray.Ubound
  LineSplit = split(LinesArray(i), ":")
  if LineSplit.Ubound > 0 then
    if LineSplit(0).len > 0 then
      ExifArray(i,0) = LineSplit(0)
      ListboxEXIF.AddRow(LineSplit(0))
      if LineSplit.Ubound > 0 then
        ListboxEXIF.Cell(i,1) = replace(LinesArray(i), LineSplit(0) + ": ", "")
      end if
    end if
  end if
next

end if

Ergebnis:

Prima, das sieht doch gar nicht so kompliziert aus. Muss ich mal sehen, wie ich das bei mir rein bekomme.

Ich nehme an, das funktioniert auch unter Linux?

Danke für den Code!

Gruß, Stefan Mettenbrink.

Das ist eine Version mit Horst’s Methode, bei der exiftool im Programm integriert ist (OSX)
Einfach ein Bild auf die Listbox schieben.
Für Windows oder Linux müsste der bin Ordner noch hinzugefügt werden (Build Step - Copy) und der Pfad in der Methode
angepasst werden.

Hallo Horst Jehle
ich bin an Dein Tool interessiert mich sehr.
Leider bekomme ich imm der Fehlermeldung: bash exiftool: command not found
Wenn ich den CMD befahl im Terminal eingebe, dann funktioniert es?
Vielleicht kannst Du weiterhelfen?
liebe Grüße
Micha

in einer OSX Shell solltest Du den vollen Pfad nehmen, kannst Du herausfinden indem Du im Terminal

which exiftool

eingibst.

Das Ergebnis übernimmst Du dann in deine Shell

z.B. /usr/bin/exiftool

Ich würde dieses Thema gerne noch einmal aufgreifen:

Kann mir jemand dabei weiterhelfen, IPTC-Daten in eine JPEG-Datei zu schreiben?
Ziel-Platform ist in diesem Fall Windows. Wenn’s unter MacOS läuft, schadet es auch nicht :wink:

LG Henricus