Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Anonymous4722
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 545

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

21.01.2020, 02:00. Показов 2464. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.01.2020, 02:00
Ответы с готовыми решениями:

Недостаточно памяти при работе с большим количеством изображений
Добрый вечер уважаемые форумчани. Помогите пожалуйста понять причину в коде. Сделал программу для ввода текста в изображение при массиве...

Программа галерея изображений
Делаю прогу галерея изображений в Embarcadero C++ Builder XE 2011. Не могу понять в чем тут ошибка. Если кто знает подскажите плз! Пример...

Программа не может продолжить работу, так как недостаточно памяти. Утечка в WPF?
В общем, есть у меня контрол, который наследует от Image, воспроизводит анимацию просто сменяя изображения из массива. А сменяются...

12
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
21.01.2020, 10:45
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
В общем есть недоделанное приложение, которое позволяет просматривать изображения, а находятся они с помощью проводника "treeView", а выводится в pictureBox.
вам нужно создавать такое количество PictureBox как картинок в выбранной папке и уже размещать их
0
 Аватар для Anonymous4722
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 545
21.01.2020, 10:48  [ТС]
Цитата Сообщение от FateOri Посмотреть сообщение
вам нужно создавать такое количество PictureBox как картинок в выбранной папке и уже размещать их
А нельзя ли сделать так: выбрал папку с картинками и они в pictureBox появились, а выбираю я из TreeView эти папки с картинками. Или как сделать проще? Просто создавать кучу pictureBox мне кажется странно..
0
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
21.01.2020, 11:05
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
выбрал папку с картинками и они в pictureBox появились, а выбираю я из TreeView эти папки с картинками. Или как сделать проще? Просто создавать кучу pictureBox мне кажется странно..
можно картинки склетить и отобразить в одном pictureBox но при ресайзе будет некрасиво
0
 Аватар для Anonymous4722
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 545
21.01.2020, 11:07  [ТС]
Цитата Сообщение от FateOri Посмотреть сообщение
можно картинки склетить и отобразить в одном pictureBox но при ресайзе будет некрасиво
А как сделать так, как на скрине? Там выбирается папка и показываются все изображения.
0
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,869
21.01.2020, 11:39
Anonymous4722, Держите, дальше сами там разберетесь.
Миниатюры
Программа "Галерея изображений", выводит исключение "недостаточно памяти"  
Вложения
Тип файла: rar CyberforumPhoto.rar (262.3 Кб, 29 просмотров)
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4360 / 3430 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
22.01.2020, 14:24
можете использовать FlowLayoutPanel и в нее добавлять динамически созданные PictureBox'ы, получится в
как в галерее.
0
 Аватар для Anonymous4722
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 545
22.01.2020, 21:49  [ТС]
Kazbek17, PictureBox это одна картинка и я не так сделал. Надо было использовать ListView
0
 Аватар для Anonymous4722
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 545
22.01.2020, 21:53  [ТС]
Цитата Сообщение от Kazbek17 Посмотреть сообщение
сами там разберетесь.
Проект не запускается.
Миниатюры
Программа "Галерея изображений", выводит исключение "недостаточно памяти"  
0
 Аватар для Anonymous4722
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 545
02.02.2020, 00:45  [ТС]
Цитата Сообщение от Kazbek17 Посмотреть сообщение
Держите, дальше сами там разберетесь.
Вы скажите, что в Tag надо прописывать, а то он исключение выбрасывает и я разобраться не могу.
0
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,869
02.02.2020, 16:52
Anonymous4722, По условию наверное видно что какой там тип хранится. true или false. Это сделано для того, чтобы при выделение узла загружались фото т.е вся папка сразу загружается. поменяйте алгоритм и сделайте как вам нужно. Если не хватает знаний, читайте ресурсы, смотрите примеры.
0
 Аватар для Anonymous4722
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 545
02.02.2020, 17:22  [ТС]
Цитата Сообщение от 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
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
03.02.2020, 01:23
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Как избежать утечки памяти?
в примере утечек нет. чтобы уменьшить потребление памяти надо уменьшать разрешение картинки при загрузке, еще можно реализовать виртуальный скролл так чтобы в памяти были только видимые картинки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.02.2020, 01:23
Помогаю со студенческими работами здесь

Галерея изображений - галерея видео
Доброго времени суток. Подскажите какими модулями и плагинами пользоваться для создания галереи изображения и галереи фото ? В...

Галерея изображений
Есть галерея изображений на jQuery (вот демо). Описание к изображениям выводится в той же рамке, что и изображение, а хотелось бы...

Галерея изображений
Засмотрелся на скрины мака, решил замутить такую галерею... Как реализовать красивые наклонные картинки? Если конкретней, то: 1 Как...

Галерея изображений
Возможно я пишу не в тот раздел, мне показалось что это реализуется через JQ. Вопрос: Может кто нибудь видел где нибудь туториал или...

Галерея изображений
Здравствуйте! Необходимо сделать галерею как на рис1. Так как я не очень разбираюсь в jQuery скачала готовый скрипт и переделала под себя....


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru