Thumbnails aus JPEG-Dateien mit C# auslesen

Schonmal gewundert, wie der Windows Explorer oder Picasa so schnell Thumbnails für Bilder erzeugen, auch wenn diese Bilder wirklich komplett neu sind und nicht bereits indexiert sein können?

Das liegt einfach daran, dass in der JPEG-Datei bereits ein Thumbnails enthalten ist, welches von der Digitalkamera erzeugt wurde. Somit muss nicht einmal die komplette JPEG-Datei eingelesen werden, um das Thumbnail zu laden.

Das Zauberwort hierzu heißt EXIF. Dies ist ein Standard, bei dem ziemlich viele Metadaten in der Bilddatei abgespeichert werden, z.B. über den Hersteller, das Kameramodell oder ob ein Blitz verwendet wurde und eben auch ein Thumbnail.

Bereits die Boardmittel von Microsoft .NET unterstützen das Auslesen dieser EXIF-Header und damit auch des Thumbnails. Siehe dazu die MSDN-Dokumentation zu Image.GetThumnail und Image.GetPropertyItem.

Das Problem ist jedoch, dass diese Boardmittel extrem langsam sind. Ich hatte zunächst vermutet, dass gar nicht das Thumbnail verwendet wird, sondern das richtige „große“ Bild skaliert wird. Dies ist aber nicht so.

Glücklicherweise konnte ich folgenden EXIF-Reader finden: MetaDataExtractor.

MetaDataExtractor liest natürlich alle EXIF-Header aus. Mich interessiert aber im folgenden C#-Snippet nur das Thumbnail:

var metaData = JpegMetadataReader.ReadMetadata(new FileInfo(fullName));

foreach (var d in metaData.OfType<ExifDirectory>())
{
   byte[] thumbnail = d.GetThumbnailData();
   return thumbnail;
}

Tests mit Bildern von Kameras unterschiedlicher Hersteller hat die Bibliothek bestanden.

Gegenüber den .NET-Boardmitteln ist die Bibliothek 4-5x schneller.

Ich hoffe dieser Beitragt hilft der Entwicklergemeinde, da über das Thema bei Google derzeit nicht so schnell etwas zu finden ist. Viele EXIF-Reader funktionieren nicht so einwandfrei oder kapseln einfach mal die langsame API von .NET.