Sonntag, 1. März 2009

Versteckte Schätze

Egal in welches Gebiet man sich vorwagt, es gibt für eigentlich alles eine mehr oder weniger gut geeignete Java API. Es ist nur nicht immer ganz einfach eine passende zu finden. Zum Manipulieren von EXIF Bilddaten bin ich vor einiger Zeit auf die Sanselan API gestoßen. Ganz zufrieden war ich damit jedoch nie. Mangelnde Dokumentation, komplizierte Bedienung und die kontinuierliche Verweigerung, die in Jpeg EXIF eingebettete Thumbnails zu laden, waren einige Eigenheiten, die mir nicht gefallen haben. Durch Zufall ist mir gestern eine gut verteckte API in die Finger geraten, die durch Einfacheit besticht, die Thumbails lädt und die EXIV Daten auch wieder zurückschreiben kann. Eine Dokumentation existiert zwar scheinbar nicht, aber die API ist nahezu selbsterklärend. Gefunden habe ich dieses Goldstück im Java Image Manager (Jim) Projekt - einem Bildverwaltungsprogramm, das auf den ersten Blick mit einer ehr gewöhnungsbedürftigen Oberfläche und wenig Funktionsumfang daherkommt. Ein Blick ins Innere hat sich dafür umso mehr gelohnt. Die jim-io.jar, die mit dem Programm mitkommt, enthält so ziemlich alles, was ich von einer solchen API erwarten würde und auch der Sourcecode ist wieder mit dabei. Bleibt nur noch zu hoffen, dass sich keine schwerwiegenden Bugs finden, die mir die Freude über diesen Fund wieder nehmen. Hier noch ein paar Codefragmente zum Umgang mit jim-io.


    public Metadata readMetadata(File imageFile) throws MetadataException {
final JpegReader reader = new JpegReader();
final Metadata metadata = reader.readImage(imageFile);
final Iterator directoryIterator = metadata.getDirectoryIterator();

while (directoryIterator.hasNext()) {
Directory directory = directoryIterator.next();
if(directory instanceof ThumbnailTiffDirectory) {
byte[] thumbnailData = ((ThumbnailTiffDirectory)directory).getThumbnailData();
}
System.out.println(directory.getName());
Iterator tagIterator = directory.getTagIterator();
while (tagIterator.hasNext()) {
Tag tag = tagIterator.next();
System.out.println(tag.getTagName() + "="+ tag.getDescription());

}
}
return metadata;
}

public void updateMetadataTag(Tag tag, Object value) {
tag.update(value);
}

public void writeMetadata(Metadata metadata, File output) throws JpegProcessingException {
JpegWriter writer = new JpegWriter();
writer.writeImage(metadata, output);
}

Update Die Library entstammt eigentlich aus dem Metadata Extractor Projekt. Dank der Refactorisierungsmöglichkeiten moderner IDEs war das allerdings nicht mehr wirklich ersichtlich.

Update 2
Ergänzende Links zum Thema Exifdaten:
http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
http://commons.wikimedia.org/wiki/Commons:Manipulation_von_Metadaten

Keine Kommentare:

Kommentar veröffentlichen