ich suche nach einer Möglichkeit mittels C# das Thumbnail einer JPEG-Datei auszulesen. Wichtig: mir geht es nicht darum ein neues Thumbnail zu erzeugen! Es soll das vorhandene genutzt werden, denn das ist um Faktor 10 schneller.
Mit .NET-Boardmitteln geht das so nicht oder ist einfach zu langsam. Laut Dokumentation nutzt Image.GetThumbnailImage das eingebettete Thumbnail, aber bei 3000 Photos dauert das auslesen ca. 50 Minuten. Mit .NET-Hausmitteln komme ich auch an explizit an das Thumbnail ran:
PropertyItem p = img.GetPropertyItem(THUMBNAIL_DATA);
aber die Geschwindigkeit ist genauso wie bei GetThumbnailImage.
Nach stundenlanger Recherche habe ich einige Reader für EXIF gefunden, die aber alle nur Metadaten wie "Zoomwinkel" oder "Hersteller" auslesen.
Zuletzt habe ich jhead gefunden. Das ist zwar einen Konsolentool, extrahiert aber zuverlässig und schnell die Thumbnails:
Leider aber nur, wenn das Quellverzeichnis auch schreibbar ist, was definitiv ein Bug ist, denn der Befehl -st greift ja nur lesend auf die Dateien zu.
Da ich das jedoch auch auf einem CD-Laufwerk ausführen möchte, scheidet dieses Tool also aus.
Kennt jemand noch eine kleine Bibliothek, die sowas erledigt?
Sowohl MetaDataExtractor (Java, aber C#-Port vorhanden) als auch EXIFextractor lesen Thumbnaildaten aus, dazu gehört auch der Bytestream des Thumbnails, den du dann verwenden kannst.
EXIFextractor ist nur ein Wrapper die .NET-API Image.GetPropertyItem und dementsprechend langsam, in meinen Tests hat es auch nicht funktioniert. MetaDataExtractor teste ich gleich, danke
Die Antwort von LunaticShade mittels MetaDataExtractor hat geklappt. Hier der Code für alle die das gleiche Problem haben:
var metaData = JpegMetadataReader.ReadMetadata(new FileInfo(fullName));
foreach (var d in metaData.OfType<ExifDirectory>()) { byte[] thumbnail = d.GetThumbnailData(); return thumbnail; }
Die Performance ist 4-5x schneller als mit Image.GetThumbnail(). Allerdings ist da wohl noch Verbesserungspotential, da die Library exzessiv in die Console loggt.