| 

.NET C# Java Javascript Exception

3
Hallo,

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:

jhead -st "V:\thumbs\sample.jpg" "G:\Bilder11\*.JPG"


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?

Viele Grüße
Andreas
17.05.2012
kleffel 654 1 9
2 Antworten
2
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.
17.05.2012
LunaticShade 507 4
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
kleffel 18.05.2012
MetaDataExtractor klappt, siehe separates Code Posting
kleffel 18.05.2012
2
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.
18.05.2012
kleffel 654 1 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH