37 messaggi dal 30 maggio 2008
Ciao a tutti,
sto cercando si capire perche quando nel mio progetto per caricare delle immagini e cosi lento
mi spiego meglio: sto svillupando un progetto in C# con WInforms e ho un panello che ospita un array di foto ,posto il codice :
public partial class ArtLabel : Form
    {
        private System.Windows.Forms.PictureBox[] imgArray;  
        public static string ImageToShow;
        private int NumOfFiles;
        private string[] imgExtension;
    
        
        public ArtLabel()
        {
            InitializeComponent();
            panel1.VerticalScroll.Visible = true;
            panel1.VerticalScroll.Enabled = true;
          //  panel1.VerticalScroll.Maximum = 1000;
            panel1.VerticalScroll.Value = panel1.VerticalScroll.Maximum;
 
        }

        private void ArtLabel_Load(object sender, EventArgs e)
        {
           GetPicture4(@"D:\\Music\\");
        }

        private bool ThumbnailCallback()
        {
            return false;
        }

        private void ARR(int cNumber, string exc)
        {
         int Xpos = 8;
            int Ypos = 8;
            Image img;
            Image.GetThumbnailImageAbort myCallback =
            new Image.GetThumbnailImageAbort(ThumbnailCallback);
            imgArray = new System.Windows.Forms.PictureBox[cNumber]; // assign number array 
            for (int i = 0; i < cNumber; i++)
            {
                imgArray[i] = new System.Windows.Forms.PictureBox(); 
               if (Xpos > 432) // six images in a line
                {
                    Xpos = 8; // leave eight pixels at Left 
                    Ypos = Ypos + 72;  // height of image + 8
                }

                        imgArray[i].Left = Xpos;
                        imgArray[i].Top = Ypos;
                        imgArray[i].Width = 64;
                        imgArray[i].Height = 64;
                        imgArray[i].Visible = true;
                        imgArray[i].SizeMode = PictureBoxSizeMode.StretchImage;
                        img = Image.FromFile(exc);
                        imgArray[i].Tag = exc;
                        imgArray[i].Click += new System.EventHandler(ClickImage);
                        imgArray[i].Image = img.GetThumbnailImage(64, 64, myCallback, IntPtr.Zero);
                        panel1.Controls.Add(imgArray[i]);
                        Application.DoEvents();
                        Xpos = Xpos + 72;  

            }

        }

        private List<string> GetPicture4(string Folder)
        {
            DirectoryInfo dir = new DirectoryInfo(Folder);
            List<string> str = new List<string>();
            FileInfo[] files = dir.GetFiles("*.jpg", SearchOption.AllDirectories);
            int NumOfFiles = files.Length; 
            imgExtension = new string[NumOfFiles];

            for (int i = 0; i < NumOfFiles; i++)
            {
                ARR(i, files[i].FullName); 
                str.Add(files[i].FullName);
            }

            return str;


        }

        
        private void ClickImage(Object sender, System.EventArgs e)
        {
            ImageToShow = ((System.Windows.Forms.PictureBox)sender).Tag.ToString();
            Direcoty_Prova.ViewPicture f = new Direcoty_Prova.ViewPicture();
            f.ShowDialog();
        }

       
    }

Questo e il codice completo del Form .
Adesso quando vado a chiamare questo Form se metto come indirizzo Folder un cartella con più di 30 foto(bassa risoluzione)devo aspettare più di 2 minuti  ,(credo che sia un po troppo) e questo non è il risultato che desidero.
Dove sbaglio nel mio codice che cause questa lunga attesa nel caricare le foto ?
Grazie di tutto.

Buona giornata
Ridimensionare un'immagine non è un'operazione così banale, soprattutto se l'immagine originale non è piccola e sopratutto anche dal formato dell'immagine. Per esempio se questa è progressiva o interlacciata fa la differenza, si potrebbe caricarne solo una porzione e non interamente.
Invece di GetThumbnail prova con new Bitmap(imgOriginale, width, height), anche se non mi ricordo quale dei due è più performante.
Considera in alternativa questo http://danbystrom.se/2008/12/14/improving-performance/

Inoltre, ridimensiona in asincrono, in un altro thread. Fare un loop con Application.DoEvents è brutto brutto (molto vb6). Così all'utente restituisci subito il controllo e le immagini le vedi comparire pian piano.

Infine potresti considerare anche l'utilizzo del file Thumbs.db che crea il sistema operativo per le miniature. Guarda qua
http://www.petedavis.net/MySite/DynPageView.aspx?pageid=31

Ciao

Il mio blog
Homepage
37 messaggi dal 30 maggio 2008
Ciao Ricciolo,
grazie di avermi risposto ,
io ho trovato una soluzione per caricare le foto in modo piu veloce ma i tuoi link postati sono interessanti quindi forse cambierò qualcosa nel mio codice.
Grazie dei tuoi (sempre soddisfacenti) consigli.
Ciao

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.