Autor Beitrag
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 17.02.06 18:39 
Hallo!

Ich möchte in einer Listview Bilder in Form von Thumbnails anzeigen. Momentan erstelle ich die Thumbnails wie folgt:
ausblenden 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Christian S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 20.02.06 18:23 
Ich erlaube mir, hier nochmal nachzuschieben. :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 schon gesehen? Vielleicht hilft das schon ein wenig.
Christian S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 schon gesehen? Vielleicht hilft das schon ein wenig.
Die nutzen leider auch nur die Methoden, welche ich auch schon anwende. Trotzdem Danke!

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Christian S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 20.02.06 20:46 
Hallo!

Mal zu schauen, welcher Teil des Codes langsam ist, war goldrichtig. Dadurch habe ich diesen 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, 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 !!

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 gibt es den ersten Versuch, dann kam .NET 2.0.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".