C# Prosta przeglądarka JPG - zwalnianie pamięci po bitmapach

0

Witam! Jestem początkujący, robię prostą przeglądarkę JPGów. Mam problem ze zwalnianiem pamięci (po bitmapach)

Zmajstrowałem taki kod:

  Bitmap MyImage; 
        public void ShowMyImage(int PicBoxNo, String fileToDisplay)
        {
          
            MyImage = new Bitmap(fileToDisplay);

            if (PicBoxNo == 1)
            {
                // Stretches the image to fit the pictureBox.
  
                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox1.Image = (Image)MyImage;

                // Stretches the image to fit the pictureBox.
                pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox2.Image = (Image)MyImage;
            }

            if (PicBoxNo == 2)
            {
                // Stretches the image to fit the pictureBox.
                pictureBox3.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox3.Image = (Image)MyImage;
            }

            if (PicBoxNo == 3)
            {

                // Stretches the image to fit the pictureBox.
                pictureBox4.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox4.Image = (Image)MyImage;
            }

            if (PicBoxNo == 4)
            {
                // Stretches the image to fit the pictureBox.
                pictureBox5.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox5.Image = (Image)MyImage;
            }

            

        }

Mam 5 pictureboxów, podaje nazwy plików i wyświetlam JPG w odpowiednich PicBOX-ach.

Do tego mam obsługę "przewijania" (zmiana strony ze zdjęciami, po 4-5 zdjec na stronę).

   private void button3_Click(object sender, EventArgs e)
        {
            if (PageOfImages > 1)
            {
                PageOfImages--;
                label1.Text = PageOfImages.ToString();

                MyImage.Dispose();


                ShowAllImages();
            }

        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (PageOfImages < MaxPageOfImages)
            {
   
                PageOfImages++;
                label1.Text = PageOfImages.ToString();

                MyImage.Dispose();
                
                ShowAllImages();
            }
        }

Wszystko działa dobrze jak mam do 40-48 zdjęć (czyli 10-12 stron zdjęć). Problem pojawia się jak jest więcej. Sypie oczywiście błędem "out of Memory".

Pytanie - jak sobie z tym poradzić? Jak i gdzie (w którym miejscu kodu) zwolnić pamięć po zdjęciach (które już nie są wyświetlane, tj. nie są z wyświetlanej strony)?

Dzieki!

Der

0

W c# pisalem ostatnio dluzszy czas temu, ale czy przypadkiem nie wystarczy po prostu http://msdn.microsoft.com/en-us/library/8th8381z.aspx ?

0

Jak widzisz używam w kodzie Dispose w procedurach button4_Click i button3_Click.

0

problem zapewne jest w tym, ze wczytujesz duze zdjecia i tylko je skalujesz aa nie tworzysz miniatury.
Wczytaj sobie do czegokolwiek (np GIMP) 100 duzych zdjec/obrazkow i tez sie pamiec skonczy

0

Zgadza się. Muszę zrobić miniaturki (mam już funkcję resize), tylko zastanawiam się czy miniaturki zapisywać an dysk czy tylko trzymać w pamięci... Wtedy przy każdym uruchomieniu trzeba pomniejszać, a tak jakiś katalog TEMP i kłopot byłby rozwiązany... Co jest wg. Was lepszym rozwiązaniem?

0

W ostatecznosci mozesz jeszcze sprobowac http://msdn.microsoft.com/en-us/library/xe0c2357.aspx chociaz prawde mowiac nie wiem czy to pomoze...

0

Ja kiedyś pisałem taką przeglądarkę i miniaturki robiłem za każdym razem w locie, i używałem właśnie GC.Collect().
Tylko to nie było zbyt dobre rozwiązanie. A jak Windows to robi?

0

A jak Windows to robi?

Windows, czyli co? Windows Fax/Images Viewer ?

Przeglądarki, jak ACDSee czy IrfanView wyświetlają tylko miniaturki z JPEG-a, w sumie nie bardzo wiem jak się dobrać do samej miniaturki, a później jeśli trzeba wyświetlają pełen obraz.

0

Miałem kiedyś podobny problem. Spróbuj po Dispose() zrobić:

GC.Collect();
GC.WaitForPendingFinalizers();

Chociaż dziwne, że .NET sam sobie nie radzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1