4 / 2 / 1
Регистрация: 29.11.2012
Сообщений: 495
1

Программа "Галерея изображений", выводит исключение "недостаточно памяти"

21.01.2020, 02:00. Показов 1821. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем есть недоделанное приложение, которое позволяет просматривать изображения, а находятся они с помощью проводника "treeView", а выводится в pictureBox.
Как избежать утечки памяти?
Пример, как я хочу сделать в картинке.
код программы
Кликните здесь для просмотра всего текста
C#
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Img
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            treeView1.BeforeSelect += treeView1_BeforeSelect;
            treeView1.BeforeExpand += treeView1_BeforeExpand;
 
            FillDriveNodes();
        }
        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            e.Node.Nodes.Clear();
            string[] dirs;
 
            try
            {
                if (Directory.Exists(e.Node.FullPath))
                {
                    dirs = Directory.GetDirectories(e.Node.FullPath);
                    if (dirs.Length != 0)
                    {
                        for (int i = 0; i < dirs.Length; i++)
                        {
                            TreeNode dirNode = new TreeNode(new DirectoryInfo(dirs[i]).Name);
                            FillTreeNode(dirNode, dirs[i]);
                            e.Node.Nodes.Add(dirNode);
                        }
                    }
                }
            }
            catch (Exception) { }
        }
 
        void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
        {
            e.Node.Nodes.Clear();
            string[] dirs;
            try
            {
                if (Directory.Exists(e.Node.FullPath))
                {
                    dirs = Directory.GetDirectories(e.Node.FullPath);
                    if (dirs.Length != 0)
                    {
                        for (int i = 0; i < dirs.Length; i++)
                        {
                            TreeNode dirNode = new TreeNode(new DirectoryInfo(dirs[i]).Name);
                            FillTreeNode(dirNode, dirs[i]);
                        }
                    }
                }
            }
            catch (Exception) { }
        }
 
        private void FillTreeNode(TreeNode driveNode, string path)
        {
            try
            {
                string[] dirs = Directory.GetDirectories(path);
                foreach (string dir in dirs)
                {
                    TreeNode dirNode = new TreeNode();
                    dirNode.Text = dir.Remove(0, dir.LastIndexOf("\\") + 1);
                    driveNode.Nodes.Add(dirNode);
                }
            }
            catch (Exception) { }
        }
 
        private void FillDriveNodes()
        {
            try
            {
                foreach (DriveInfo drive in DriveInfo.GetDrives())
                {
                    TreeNode driveNode = new TreeNode { Text = drive.Name };
                    FillTreeNode(driveNode, drive.Name);
                    treeView1.Nodes.Add(driveNode);
                }
            }
            catch (Exception) { }
        }
 
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
 
        }
 
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            PreviewDirectory(e.Node.FullPath); // Обрабатываем папку
        }
        private void PreviewDirectory(string path)
        {
            var maxWidth = pictureBox1.Width;
            var thumbWidth = 128;
            var thumbHeight = 128;
            var nextWidth = 10;
            var nextHeight = 10;
 
            pictureBox1.Controls.Clear();
 
            foreach (var filePath in Directory.EnumerateFiles(path, "*.jpg", SearchOption.TopDirectoryOnly))
            {
 
                pictureBox1.Controls.Add(
                    new PictureBox()
                    {
                        Width = thumbWidth,
                        Height = thumbHeight,
                        Left = nextWidth,
                        Top = nextHeight,
                        BackColor = Color.Black,
                        BackgroundImageLayout = ImageLayout.Zoom,
                        BackgroundImage = Image.FromFile(filePath)
                    });
 
                nextWidth += thumbWidth + 10;
                if (nextWidth + thumbWidth > maxWidth)
                {
                    nextWidth = 10;
                    nextHeight += thumbHeight + 10;
                }
            }
        }
    }
}
Миниатюры
Программа "Галерея изображений", выводит исключение "недостаточно памяти"   Программа "Галерея изображений", выводит исключение "недостаточно памяти"  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2020, 02:00
Ответы с готовыми решениями:

Программа для просмотра изображений, реализовать переход "следующее" и "предыдущее"
Как сделать переключатель изображения? То есть кнопку типа &quot;Next image&quot;, при нажатии на которую в...

Выводит ошибку на строке StudentA student = new Student ("Динар", "19", "Е09-31");В чем причина?
using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

"Недостаточно памяти" при загрузке нескольких картинок в pictureBox
Отстраиваю, несколько этак 15-50 картинок на пенеле. И вылитает сообщение: об ошибке &quot;Недостаточно...

Исключение "Произошла одна или несколько ошибок" + innerException "Отменена задача"
Очень часто выкидывает исключение innerException - &quot;Отменена задача&quot;. Пока копировал, в первый раз...

12
Фрилансер
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,847
21.01.2020, 10:45 2
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
В общем есть недоделанное приложение, которое позволяет просматривать изображения, а находятся они с помощью проводника "treeView", а выводится в pictureBox.
вам нужно создавать такое количество PictureBox как картинок в выбранной папке и уже размещать их
0
4 / 2 / 1
Регистрация: 29.11.2012
Сообщений: 495
21.01.2020, 10:48  [ТС] 3
Цитата Сообщение от FateOri Посмотреть сообщение
вам нужно создавать такое количество PictureBox как картинок в выбранной папке и уже размещать их
А нельзя ли сделать так: выбрал папку с картинками и они в pictureBox появились, а выбираю я из TreeView эти папки с картинками. Или как сделать проще? Просто создавать кучу pictureBox мне кажется странно..
0
Фрилансер
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,847
21.01.2020, 11:05 4
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
выбрал папку с картинками и они в pictureBox появились, а выбираю я из TreeView эти папки с картинками. Или как сделать проще? Просто создавать кучу pictureBox мне кажется странно..
можно картинки склетить и отобразить в одном pictureBox но при ресайзе будет некрасиво
0
4 / 2 / 1
Регистрация: 29.11.2012
Сообщений: 495
21.01.2020, 11:07  [ТС] 5
Цитата Сообщение от FateOri Посмотреть сообщение
можно картинки склетить и отобразить в одном pictureBox но при ресайзе будет некрасиво
А как сделать так, как на скрине? Там выбирается папка и показываются все изображения.
0
1437 / 899 / 446
Регистрация: 06.02.2012
Сообщений: 2,769
21.01.2020, 11:39 6
Anonymous4722, Держите, дальше сами там разберетесь.
Миниатюры
Программа "Галерея изображений", выводит исключение "недостаточно памяти"  
Вложения
Тип файла: rar CyberforumPhoto.rar (262.3 Кб, 27 просмотров)
0
Модератор
Эксперт .NET
3893 / 3215 / 484
Регистрация: 27.01.2014
Сообщений: 5,898
22.01.2020, 14:24 7
можете использовать FlowLayoutPanel и в нее добавлять динамически созданные PictureBox'ы, получится в
как в галерее.
0
4 / 2 / 1
Регистрация: 29.11.2012
Сообщений: 495
22.01.2020, 21:49  [ТС] 8
Kazbek17, PictureBox это одна картинка и я не так сделал. Надо было использовать ListView
0
4 / 2 / 1
Регистрация: 29.11.2012
Сообщений: 495
22.01.2020, 21:53  [ТС] 9
Цитата Сообщение от Kazbek17 Посмотреть сообщение
сами там разберетесь.
Проект не запускается.
Миниатюры
Программа "Галерея изображений", выводит исключение "недостаточно памяти"  
0
4 / 2 / 1
Регистрация: 29.11.2012
Сообщений: 495
02.02.2020, 00:45  [ТС] 10
Цитата Сообщение от Kazbek17 Посмотреть сообщение
Держите, дальше сами там разберетесь.
Вы скажите, что в Tag надо прописывать, а то он исключение выбрасывает и я разобраться не могу.
0
1437 / 899 / 446
Регистрация: 06.02.2012
Сообщений: 2,769
02.02.2020, 16:52 11
Anonymous4722, По условию наверное видно что какой там тип хранится. true или false. Это сделано для того, чтобы при выделение узла загружались фото т.е вся папка сразу загружается. поменяйте алгоритм и сделайте как вам нужно. Если не хватает знаний, читайте ресурсы, смотрите примеры.
0
4 / 2 / 1
Регистрация: 29.11.2012
Сообщений: 495
02.02.2020, 17:22  [ТС] 12
Цитата Сообщение от Kazbek17 Посмотреть сообщение
По условию наверное видно что какой там тип хранится. true или false.
Я менял tag на true или false и все равно не работает. У вас же как-то заработало на скрине. Вот такое исключение выбрасывает у меня
C#
1
System.InvalidCastException: "Заданное приведение является недопустимым."
Добавлено через 42 секунды
И вот тут исключение срабатывает
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ((bool)node.Tag == true)
            {
                foreach (TreeNode path in node.Nodes)
                {
                    PictureBox image = new PictureBox();
                    image.Image = Image.FromFile(path.Text);
                    image.SizeMode = PictureBoxSizeMode.StretchImage;
                    image.Width = 100;
                    image.Height = 100;
                  
                    image.Margin = new Padding(0, ++Top, 0, 0);
                    panel1.Controls.Add(image);
                }
            }
0
1114 / 828 / 258
Регистрация: 30.04.2009
Сообщений: 3,459
03.02.2020, 01:23 13
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Как избежать утечки памяти?
в примере утечек нет. чтобы уменьшить потребление памяти надо уменьшать разрешение картинки при загрузке, еще можно реализовать виртуальный скролл так чтобы в памяти были только видимые картинки.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2020, 01:23
Помогаю со студенческими работами здесь

Ошибка "Необработанное исключение типа "System.AccessViolationException""
Здравствуйте. Имею, не побоюсь сказать, такой геморрой в виде вот такой ошибки: del Выпадает...

Цель - при нажатии на кнопку создать еще одну кнопку. Ошибка "Button" не содержит определения для "Location" и "Text""
int Control ; private void Button2_Click(object sender, RoutedEventArgs e) {...

Классы "Работник", "Календарь", "Оплата труда за месяц". Вывод табеля рабочего времени сотрудника
1. Реализовать класс работник, у класса свойства фамилия (строка), имя (строка), отчество (строка),...

Выдает ошибку - "Не удалось привести тип объекта "TheMaze.FormLevel1" к типу "System.Windows.Forms.Label"."
Ругается вот на эту строчку: ((Label)sender).Visible = false; Вот код: using System; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru