Sposób na mniejsze zżeranie pamięci - galeria zdjęć

0

Witam. Zacząłem pisać galerię, taką po prostu, pliki graficzne, które mamy w naszym osobistym folderze itd. Problem pojawił się już na początku. Po wczytaniu z 15 plików (rozmiary od ~500px do ~2000px), program żre 90MB pamięci. Domyślam się, że trzyma w pamięci te wczytane zdjęcia, no jakby inaczej, jakoś je trzeba wyświetlić. Pytanie teraz jak do ograniczyć, przecież po wczytaniu wszystkich zdjęć program będzie jadł tyle co Battlefield -.- Właśnie, tam są modele, tekstury itd. i jakoś zajmuje ok. 1GB pamięci, a tu jakbym wczytał całą bibliotekę to tyle samo by mój jadł. Jak to ograniczyć? Może poprzez skalowanie i trzymaniu w pamięci tej pomniejszonej kopii, ale znów mam zamiar zrobić "ślizgacz" do pomniejszania/powiększania miniaturek, i tak za każdym razem skalować 200+ zdjęć to nie wiem czy to szybko pójdzie. Jakie są dobre rozwiązania tego? Prosiłbym o opinie na ten temat.

Dodam, że piszę w C# i wykorzystuję kontrolkę PictureBox. A może przy wczytywaniu przekonwertować na JPG te miniatury, bo tak to, wszystko jako bitmapa jest trzymane i stąd taki głód.

0

Ale po co wszystkie ładujesz od razu? Jak trzeba będzie wyświetlić to załaduj, a po wyświetleniu od razu usuń z pamięci.

0

Ładuję wszystko, bo jak mówię jest to galeria, mam wszystkie obrazy wyświetlone tyle, że w miniaturkach - no właśnie, a ja trzymam je całe :/ To więc dobrym rozwiązaniem będzie je przeskalować ileś tam razy, zależnie od wybranego przez użytkownika rozmiaru tych miniaturek? I wtedy wyświetlać te miniatury, a jak użytkownik zechce wyświetlić w pełnym rozmiarze to wtedy załaduję cały obraz?

0

Dokładnie, musisz przeskalować i załadować obrazy, które chcesz wyświetlić w miniaturkach. A kiedy użytkownik będzie chciał wyświetlić pełne zdjęcie - załadujesz je po prostu z dysku.

0

Dobra, zrobiłem tak, teraz dla 27 obrazków w różnych rozmiarach mam 14MB, ale czy aby to nie za dużo jeszcze? Da się coś jeszcze zmniejszyć? Podaję kod, gdyby ktoś mógł wskazać czy coś można zmienić:

            // UpdateGallery
            pictures.Clear();
            flowLayoutPanel.Controls.Clear();
            string[] filesPaths = Directory.GetFiles(currentDir);
            for (int i = 0; i < filesPaths.Length; i++)
            {
                FileInfo fileInfo = new FileInfo(filesPaths[i]);
                if (IsPicture(fileInfo.Extension))
                {
                    PictureBox pictureBox = new PictureBox();
                    Bitmap original = new Bitmap(fileInfo.FullName);
                    Bitmap scaled = new Bitmap((int)(original.Width * 0.3), (int)(original.Height * 0.3));
                    Graphics graphics = Graphics.FromImage(scaled);
                    graphics.DrawImage(original, new Rectangle(0, 0, scaled.Width, scaled.Height));
                    pictureBox.Image = scaled;
                    pictureBox.Size = new System.Drawing.Size(100, 75);
                    pictureBox.BorderStyle = BorderStyle.FixedSingle;
                    pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
                    pictureBox.Tag = fileInfo.FullName;
                    pictureBox.Click += new EventHandler(pictureBox_Click);
                    pictures.Add(pictureBox.Image);
                    flowLayoutPanel.Controls.Add(pictureBox);
                    original.Dispose();
                    graphics.Dispose();
                }
            }

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