Hallo und schönen Nachmittag zusammen!
Ich habe folgenden Code um alle CD-Covers in einem bestimmten Verzeichnis, also Front und Back auszulesen:
// read all files from the selected cover directory
dir = new DirectoryInfo(@"" + txtCoverDir.Text + "");
imgFiles = dir.GetFiles("*.jpg");
stbPnlAction.Text = "Reading images file(s)";
if (imgFiles.Length > 0)
{
coverArray = new Hashtable();
stopWatch = new MAStopwatch();
stopWatch.Start();
foreach (FileInfo f in imgFiles)
{
fileName = f.Name;
albumName = fileName;
Image coverImage = Image.FromFile(txtCoverDir.Text + "/" + fileName);
// cut off the extension
if (albumName.IndexOf(".jpg") > 0)
{
albumName = albumName.Substring(0, albumName.IndexOf(".jpg"));
}
// cut (back)
if (albumName.IndexOf("(Back)") > 0)
{
albumName = albumName.Substring(0, albumName.IndexOf("(Back)"));
}
// cut (front)
if (albumName.IndexOf("(Front)") > 0)
{
albumName = albumName.Substring(0, albumName.IndexOf("(Front)"));
}
albumName = albumName.Trim();
// cover not found yet
if (!coverArray.ContainsKey(albumName))
{
coverArray.Add(albumName, new Album(albumName,
fileName, coverImage.Width, coverImage.Height));
}
else
{
Album tmpAlbum = (Album)coverArray[albumName];
tmpAlbum.AddCover(fileName, coverImage.Width, coverImage.Height);
}
stbPnlCover.Text = albumName;
milliSeconds = stopWatch.Elapsed.Milliseconds;
if (milliSeconds > 999)
{
milliSeconds = milliSeconds - 1000;
}
stbPnlTime.Text = stopWatch.Elapsed.Seconds.ToString() + "s " +
milliSeconds.ToString().PadLeft(3, '0') + "ms";
Application.DoEvents();
//coverImage.Dispose();
}
stopWatch.Stop();
}
Irgendwie ist das Ganze ziemlich langsam und dauert bei ca. 900 Dateien über 40 Sekunden. Da ich das nicht ganz glauben kann wollte ich euch fragen, ob es eventuell schnellere Methoden gibt um alle Dateien eines Verzeichnisses auszulesen bzw. ein Image zu erzeugen (um auf die Breite und Höhe des Covers schliessen zu können)
DANKE
atmosfear
Hallo atmosfear,
durch Image.FromFile wird das Bild komplett eingelesen und dekodiert. Je nachdem, wie große die einzelnen Dateien sind, sind gut 20 Dateien pro Sekunde einzulesen, ein durchaus üblicher Schnitt.
Wenn du es schneller haben willst, darfst du nur den Header der Bilder lesen. Dafür gibt es aber m.E. keine vorgefertigte .NET-Klasse/Methode. Vielleicht gibt es auf www.codeproject.com was. Wenn die Dateien ohnehin klein sind, wird das aber auch nach dieser Änderung nicht schwupps gehen.
Siehe auch: How can my program extract image dimensions from a JPEG file?
herbivore
Du könntest die thumbnails auslesen, die in der versteckten
thumbs.db verwaltet werden.
Dazu gibt es eine Lib:
http://www.petedavis.net/MySite/DynPageView.aspx?pageid=31
http://weblogs.asp.net/justin_rogers/articles/131704.aspx
mfg, meli
Gernot Melichar
Vielen Dank euch beiden und einen schönen Abend!
atmosfear