Laden...

Thumbnails für Experten ;)

Erstellt von axelfxxx vor 17 Jahren Letzter Beitrag vor 17 Jahren 5.187 Views
axelfxxx Themenstarter:in
139 Beiträge seit 2006
vor 17 Jahren
Thumbnails für Experten ;)

Hi @ All;

hier ein nicht ganz enifaches Thema, mit dem ich mich nicht wirklich auskenne, aber trotzdem für mein Prog brauche.
Ich poste mal den Code, dann kommen die Fragen:

Also falls ihn jemand gebrauchen kann: Der funktioniert soweit, und ist sogar rasend schnell!!

ZurInfo: **suchoption **ist ein durch (';') gesplittetes Array von Dateianhängen (.jpg;.gif u.s.w.) Und für jeden Dateianhang wird diese Funktion aufgerufen.



try
            {
                
                //Statusanzeige
                Status status = new Status();
                status.Show();
                status.Text = "Suche...";
                status.Statustext = "Suche nach: " + suchoption + " wurde gestartet ...";
                status.Refresh();

                string path = search_ort.Text;
                imglist = new ImageList();
                imglist.ColorDepth = ColorDepth.Depth16Bit;
                imglist.Images.Clear();
                this.ergebnisse.LargeImageList = imglist;
                this.ergebnisse.LargeImageList.ImageSize = new Size(32, 32);
                this.ergebnisse.View = View.LargeIcon;
                string[] filenames = Directory.GetFiles(path, suchoption, SearchOption.AllDirectories);
                this.ergebnisse.BeginUpdate();
                foreach (string file in filenames)
                {
                    FileInfo fi = new FileInfo(file);
                    Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
                    Image img = Image.FromFile(file).GetThumbnailImage(32, 32, myCallback, IntPtr.Zero);
                    ListViewItem lvi = new ListViewItem();
                    lvi.ImageIndex = imglist.Images.Add(img, Color.Transparent);
                    lvi.Tag = fi.FullName;
                    lvi.Text = fi.Name;
                    this.ergebnisse.Items.Add(lvi);
                    this.ergebnisse.Refresh();
                }
                status.Close();
                int treffer = filenames.Length;
                search_result.Text += Environment.NewLine + "Suche nach: " + suchoption + " : " + treffer + " Treffer.";
                this.ergebnisse.EndUpdate(); // Update Beendet,wieder öffnen
                

            }
            catch (System.Exception err)
            {
                
               MessageBox.Show("Ein Fehler bei der Desktopsuche ist aufgetreten: "
                    + System.Environment.NewLine + err.ToString(), "Fehler...", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            }

**Frage: **

  1. Ein Ordner auf meiner Festplatte hat mindest. 500 Icons. Lasse ich diese Suchroutine durchlaufen, bringt er nach ca. 200 eine Fehlermeldung: nicht genug Arbeitsspeicher (schon klar, weil jedes Bild in die Imagelist gelegt wird) Das ist nicht das Problem: Aber gibts ne Möglichkeit es noch besser zu machen. Besser: Wie müsste ich die Funktion umstellen, das er mir die Fehlermeldung nicht bringt ?Hab schon gesucht, aber keine Möglichkeit der Doppelpufferung gefunden !?

EDIT: // 2. Sobald große Dateien aufgerufen werden sollen, zeigt die Listview nur noch die Dateinamen an. (z.b. 400DPI) ; stürzt aber nicht ab!

_"In Hoffnung auf eine baldige positive Antwort verbleibe ich mit freundlichen Grüßen" _ lol

MFG Alex

---- >
Keine Signatur 😉

4.221 Beiträge seit 2005
vor 17 Jahren

Hier könnte der Hund begraben sein...


Image img = Image.FromFile(file).GetThumbnailImage(32, 32, myCallback, IntPtr.Zero);


Image img=null;
using (Image imgTemp=Image.FromFile(file))
{
   img=imgTemp.GetThumbnailImage(32,32,myCallback,IntPtr.Zero);
}

Image.FromFile liefert ja ein Image und dieses disposed Du nicht...

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

axelfxxx Themenstarter:in
139 Beiträge seit 2006
vor 17 Jahren

many thx, werd ich sofort probieren 😉

---- >
Keine Signatur 😉

axelfxxx Themenstarter:in
139 Beiträge seit 2006
vor 17 Jahren

Leider war der HUnd dort nicht begraben !

"Nicht genug Arbeitsspeicher" kommt trotzdem 🙁

Ich weiss echt nicht mehr weiter.

//Edit: Ich glaube es liegt an der IMAGELIST, das die nur soundsoviel Bilder aufnehmen kann, und dann mit der Fehlermeldung abbricht. Aber ich weiss
nicht, wie ich es anders lösen soll. Doppelpuffer gibts nicht bei Ihr.

//Edit 2: Ich hab versucht; Sobald eine bestimmte Menge an Bildern in der IMGList ist, diese dann anzuzeigen, und dann die Funktion rekursiv nochmal aufzurufen, aber NIX klappte.

---- >
Keine Signatur 😉

R
494 Beiträge seit 2006
vor 17 Jahren

Wieviele Bilder befinden sich denn in der Imagelist?
Macht es überhaupt sinn soviele da reinzupacken? kann man eh nicht alle auf einmal sehen 🙂

Du kannst dir ja mal ausrechnen maximale Anzahl der Bilder * Thumbnail größe = Speicherverbrauch.

axelfxxx Themenstarter:in
139 Beiträge seit 2006
vor 17 Jahren

Die Menge der Bilder hängt von der Anzahl der Bilder ab, die sich in von Ihm gewähltem Ordner befinden. Hat dieser User, einen Ordner mit 500 Bildern, so muss ich Ihm die Möglichkeit geben, in einer Vorschau sämtliche Bilder anzeigen zu lassen.

Siehe im Windows Explorer, die Vorschau. Genauso muss mein Programm auch laufen.

Andere Frage: Gibt denn die Möglichkeit, beim Runterscrollen, eine Vorschau aufzurufen ?

MFG
Alex

---- >
Keine Signatur 😉

4.221 Beiträge seit 2005
vor 17 Jahren

Schau Dir doch als Idee mal die beiden an.

FileBrowser / Images in X Controls
ImageListBox

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...