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

user profile iconjasocul 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.

user profile iconjasocul 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 ;-)

user profile iconjasocul hat folgendes geschrieben:
Hattest du das [http://www.aspheute.com/artikel/20020225.htm] schon gesehen? Vielleicht hilft das schon ein wenig.
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?


Christian S. - Mo 20.02.06 22:05

user profile iconjasocul hat folgendes geschrieben:
Was für ein Projekt ist das denn?
SharpPix 2.0 - der zweite Versuch einer zweiten Version. ;-)

Hier [http://www.c-sharp-forum.de/topic_SharpPix+20+inkl+Plugins_48772.html] gibt es den ersten Versuch, dann kam .NET 2.0.