Entwickler-Ecke
Multimedia / Grafik - Schnelle Erstellung von Thumbnails
Christian S. - Fr 17.02.06 18:39
Titel: Schnelle Erstellung von Thumbnails
Hallo!
Ich möchte in einer Listview Bilder in Form von Thumbnails anzeigen. Momentan erstelle ich die Thumbnails wie folgt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| lv_files.BeginUpdate();
lv_files.LargeImageList = imageList1;
progressBar1.Maximum = lv_files.Items.Count; progressBar1.Value = 0; foreach (ListViewItem lvi in lv_files.Items) { string file = ((Resizer)lvi.Tag).Sourcefile;
if (!imageList1.Images.ContainsKey(file)) { Bitmap oldBmp = (Bitmap)Bitmap.FromFile(file);
Image im = oldBmp.GetThumbnailImage(imageList1.ImageSize.Width, imageList1.ImageSize.Height, delegate { return false; }, IntPtr.Zero); imageList1.Images.Add(file, im); }
lvi.ImageKey = file;
progressBar1.Value += 1; Application.DoEvents(); }
lv_files.EndUpdate(); |
lv_files ist dabei die entsprechende Listview, welche die Thumbnails anzeigen soll (und bereits die Dateien in Form eines hier nicht wichtigen Resizer-Objektes enthält), in imageList1 werden die Thumbnails gespeichert. Dabei wird noch geschaut, ob für das Bild schon ein Thumbnail vorliegt, aber das ist erst einmal egal.
Eigentlich funktioniert das ganz prima. Das Problem: Das Teil ist unglaublich langsam, sodass man es keinem anbieten kann. Welche schnellere Methode, ein Thumbnail zu erstellen, gibt es?
Grüße
Christian
Christian S. - Mo 20.02.06 18:23
Ich erlaube mir, hier nochmal nachzuschieben. :-)
jasocul - Mo 20.02.06 19:49
An welcher Stelle ist es denn langsam?
Ich will dir gerne helfen, da ich mich ja auch gerade in C# reinhänge.
Ich würde es dann auch gleich als Übung betrachten. :wink:
Evtl. kannst du den Projekt-Source bereitstellen.
Hattest du
das [
http://www.aspheute.com/artikel/20020225.htm] schon gesehen? Vielleicht hilft das schon ein wenig.
Christian S. - Mo 20.02.06 20:12
jasocul hat folgendes geschrieben: |
An welcher Stelle ist es denn langsam? |
Die Frage hat mich schonmal ein Stück weitergebracht. Ich war bisher davon ausgegangen, dass die Berechnung der Thumbnails so lange dauert. :autsch: Dem ist nicht so, das Laden der Bilder braucht die meiste Zeit. Mit einer schnelleren Methode zur Berechnung der Thumbnails ist mir also gar nicht geholfen. :?
Die Frage ist jetzt, wie der Windows-Explorer dieses Problem ungeht und mir wirklich schnell (auch bei gelöschter thumbs.db) die Thumbnails anzeigt.
jasocul hat folgendes geschrieben: |
Evtl. kannst du den Projekt-Source bereitstellen. |
Da das Projekt, wenn's fertig ist, eh OpenSource wird (eine Vorgänger-Version ist noch in unserer OS-Projekt-Sparte zu finden, aber ohne Thumbnails ;-)) wäre das anisch kein Problem. Allerdings ist das Projekt etwas größer und ich will niemandem zumuten, sich dort hindurch zu wühlen ;-)
Die nutzen leider auch nur die Methoden, welche ich auch schon anwende. Trotzdem Danke!
Christian S. - Mo 20.02.06 20:46
Hallo!
Mal zu schauen, welcher Teil des Codes langsam ist, war goldrichtig. Dadurch habe ich
diesen [
http://weblogs.asp.net/justin_rogers/archive/2004/08/07/210487.aspx] Blogeintrag gefunden, welcher erklärt, weshalb das Laden von Bildern in .NET so grottenlangsam ist.
Und es wird auch eine Lösung angegeben, nämlich eine Klasse namens
ImageFast [
http://weblogs.asp.net/justin_rogers/articles/131704.aspx], welche direkt auf die GDI+Funktionen zugreift. PInvoke gefällt mir zwar nicht, aber es scheint keine andere Möglichkeit zu geben, dieses Feature annehmbar zu realisieren.
Und ja, mit ImageFast geht das
wirklich schnell!
Grüße
Christian
P.S.: Muss ich nur noch mal die Lizenz von ImageFast angucken ;-)
P.P.S.: Als Größenordnung: Bei einem Ordner mit 11 Bildern á 3,5MB braucht man statt 6s nur noch 0,35s !!
jasocul - Mo 20.02.06 22:03
Manchmal sieht man den Wald vor lauter Bäumen nicht. Da hilft die richtige Frage oder Blick eines Anderen auf den Source.
Freut mich, dass ich dir mit meiner einfachen Frage helfen konnte.
Was für ein Projekt ist das denn?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!