Tags

Der Begriff "Tags" (ausgesprochen [täks]) kommt aus dem Englischen und bedeutet "Schlagwort" oder "Etikett". Tags werden genutzt, um Medieninhalte mittels Schlagworten (=Tags) zu kategorisieren. Suchmaschinen können Inhalte finden (=Retrieval) nur gefunden werden, wenn die Inhalte (= Dateien) mit entsprechenden Schlagwörtern verbunden werden. Oft werden diese Schlagworte uach als "Metadaten" bezeicnet

Tags für F1-Photos

Im Prinzip ist die Namenskonvention wie ich sie bei den Zeichnungen von Sauro Torregianni verwendet habe, fast schon ausreichend um auch ein Photo zu kategorisieren:
 
        1983_ATS_D6_BMW_Winkelhock_USA East_.jpg
        
Für die Photos habe ich folgenden Kategorien verwendet:
        Jahr, Land, Strecke, Team, Autoname, Motor, Fahrername, Vorname, Zuatzinfos
    
Die TAGS kann man in einer DB abspeichern, und die Bilder durchnummerieren. Ich habe die TAGs in den Filenamen codiert. Falls das Bild kein Fahrzeug zeigt können einige TAGs im Filenamen entfallen. Falls mehrere Fahrer oder Personen zu sehen sind, werden Name, Vorname wiederholt verwendet. Beispiele:

1961_Monaco_Monte Carlo_Porsche_787_Porsche 547-3 F4_Bonnier_Jo.jpg
1962_Belgium_Spa-Francorchamps_Clark_Jim.jpg
1982_USA West_Long Beach_Lauda_Niki_Rosberg_Keke_Villeneuve_Gilles_Podium.jpg

Die Software mit der die Bilder heruntergeladen wurde, hat sie erstmal unter dem vom jeweiligen Archiv verwendeten Namen abgespeichert. Keines der Archive hat die obige Namenskonvention vollständig verwendet, die meisten aber zumindest etwas rudimentär verwandtes. Aufgrund der URL war meist das Jahr und das Rennen gegeben.Die Software hat also erstmal die vorhandenen Informationen aus dem Namen in die richtige Reihenfolge gebracht und dann aus den diversen Datenbanken ergänzt und formatiert.

Die Photos aus dem Schlegelmilch Archiv haben eine spezielle Herausforderung mit sich gebracht - sie waren durchnumeriert und die Information steckten im JPEG File in spezielen TAGs.

IPTC Tags

Der IPTC-IIM-Standard ist ein Datenformat zur Speicherung von Metadaten =(=Schlagworte, Tags) in Bilddateien (z. B. in JPEG- oder TIFF-Dateien). Es wurde 1991 als Information Interchange Model (IIM) definiert. Dabei werden Informationen () Text, Datums- und Zahlenwerte) in einem definierten Format in einem speziellen Bereich der Datei abgelegt. Der Standard ermöglicht es, Urheberrechtsvermerke, den Namen des Erstellers, eine Überschrift oder Stich-/Schlagwörter anzugeben und direkt in der Bilddatei zu speichern. Diese Art der Speicherung von Metadaten ist bei Bildagenturen und Bildarchiven sehr verbreitet.

Es gibt neben dem IPTC Tags noch weitere Metadaten in Bilddateien, die speziell von und für Kamerahersteller sind (EXIF). Unter MacOS kann man sich die Tags anzeigen lassen, die Vorschau App hat entsprechende Features:

IPTC Tags lesen und schreiben

Die Daten um die Photodateien aus dem Schlegelmilch Archiv unter einen der Namenskonvention entsprechenden Namen abzuspeichern, müssen also aus der Datei selbst gelesen werden. Wie immer gibt es dafür einige existierende Lösungen als jar Files. Allerdings habe ich keine gefunden, mit der man die Tags sowohl vernünftig schreiben als auch lesen kann. Ws es gibt ist folgendes:
  • Es gibt zum einen dem "metadata-extractor" -ein Open Source JAVA Project (Apache 2.0 licence) mit der man, wie der Name sagt, IPTC Tags auslesen kann.
  • Zum zweiten gibt es die "Apache Commons Imaging library" (vormals Sanselan), mit der kann man IPTC Tags schreiben und auch löschen.
In der Kombination der beiden konnte ich die Tags (IPTC - Keywords) lesen, und die Dateien entsprechend neu benennen. Bei den Schlegelmilch Dateien gibt es noch ein Goodie. Bei vielen Dateien hat sich die Agentur die Mühe gemacht, unter dem Caption Tag eine englische Beschreibung im Fließtext einzugeben, die wir im weiteren Verlauf des Projetes noch verwendet. Die Methode zum Auslesen sieht wie folgt aus:
    import com.drew.imaging.ImageMetadataReader;
    import com.drew.imaging.ImageProcessingException;
    import com.drew.metadata.Directory;
    import com.drew.metadata.Metadata;
    import com.drew.metadata.Tag

    public static String ListIptcTags(String PATH)  {
        String caption="";
        try
        {   File file = new File(PATH);
            Metadata metadata = ImageMetadataReader.readMetadata(file);     // Laden Metadaten aus der JPEG-Datei
            for (Directory directory : metadata.getDirectories()) {         // Durchlaufen aller Verzeichnisse und Tags in den Metadaten
                for (Tag tag : directory.getTags()) {
                    System.out.println( directory.getName()+" : "+ tag.getTagName() +":" +tag.getDescription());
                    if (directory.getName().startsWith("IPTC"))             // Überprüfen ob das Verzeichnis IPTC-Daten enthält
                    {   String TagName  =  tag.getTagName();                // Ausgabe Caption / Abstract
                        if(( TagName.equals("Caption/Abstract")  ) ) 
                            caption = tag.getDescription();
                    }
                }
            }
        }
        catch (IOException | ImageProcessingException e)  { e.printStackTrace(); }
        return (caption);
    }

Um Tags zu schreiben, hier die Tags aus dem Namen der Datei in das Keyword IPTC Tag der jpeg Datei, ist die Methode mit mehr Boilerplate Code versehen. Sie löscht in einer Kopie erst alle Tags und schreibt in einer zweiten temporären Datei die Ddaten indas Keyword Tag hinein, bevor sie die temporäre Datei abschliessend umbenennt. Sie sieht dann folgendermassen aus:
    import org.apache.commons.imaging.ImageReadException;
    import org.apache.commons.imaging.ImageWriteException;
    import org.apache.commons.imaging.formats.jpeg.iptc.*;

    public static void WriteIptcTags(String PATH)  throws IOException, ImageWriteException, ImageReadException {
        String PATH1=PATH.replace(".","tmp.");
        String PATH2=PATH.replace(".","NEU.");

        InputStream In      = new FileInputStream(PATH);
        OutputStream Out    = new FileOutputStream(PATH1);
        InputStream In2     = new FileInputStream(PATH1);
        OutputStream Out2   = new FileOutputStream(PATH2);

        new JpegIptcRewriter().removeIPTC(In,Out,true);     // Löschen aller IPTC Tags (ausser 2)
        String token[]      = PATH.split("/");
        String fname        = token[token.length-1];

        String Year         = years(fname);
        String Team         = team(fname);
        String Car          = car(fname);
        String Engine       = engine(fname);
        String Driver       = driver(fname);
        String Country      = race(fname);

        List<IptcRecord> records  = new ArrayList<>();
        List<IptcBlock> rawBlocks = new ArrayList<>();
        records.add(new IptcRecord(IptcTypes.KEYWORDS,"" + Year + " , "+Team+ " , "+Car+ " , "+Engine+ " , "+Driver+ " , "+Country));
        records.add(new IptcRecord(IptcTypes.IMAGE_TYPE,"JPG"));

        new JpegIptcRewriter().writeIPTC(In2, Out2, new PhotoshopApp13Data(records, rawBlocks));

        In.close();
        In2.close();
        Out.close();
        Out2.close();
        File tmp= new File(PATH1) ;
        if(tmp.exists())
            tmp.delete();
        File neu= new File(PATH2) ;
        neu.renameTo(new File(PATH));
        System.out.println("IPTC TAGs writing done ... !");
    }
Auch dieser Code wird wird in Laufe des Projektes nochmal zu sehen sein. Weitere beschreibbare PTC Tags sind:
    CONTENT_LOCATION_NAME
    CITY
    CATEGORY
    KEYWORDS
    COPYRIGHT_NOTIC
    WRITER_EDITOR
    IMAGE_TYPE
    CONTACT
    CREDIT
    CAPTION_ABSTRACT