Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/30: Рейтинг темы: голосов - 30, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 20.04.2015
Сообщений: 44

PictureBox слои изображений или как сделать закраску фона?

21.04.2015, 11:16. Показов 5845. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема состоит в том, что мне надо сделать заливку фона. Я пробовал делать отдельную функцию(создавался прямоугольник и задавался как backgroundImage), но сохранение я делал pictureBox1.Image.
Как можно сохранить в один файл и Image и backgroundImage?
Если нельзя, то как сделать, что прямоугольник, независимо от последовательностей действий, будет всегда снизу?

Рисование
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (e.Button == MouseButtons.Left)
            {
 
                g = Graphics.FromImage(pictureBox1.Image);
                drawPen = new Pen(color, 1);
                
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                g.DrawLine(drawPen, startPoint, e.Location);
                startPoint = e.Location;
 
                SrcImg = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
                pictureBox1.Image = SrcImg;
 
                drawPen.Dispose();
                g.Dispose();
            }
Функция для прямоугольника(только тут я уже указал обычный Image, а не фоновый)
C#
1
2
3
4
5
6
7
8
9
10
11
12
g = Graphics.FromImage(pictureBox1.Image);
            drawPen = new Pen(color, 1);
 
            Rectangle rectangle = new Rectangle(pictureBox1.Width-pictureBox1.Width, pictureBox1.Height-pictureBox1.Height, pictureBox1.Width, pictureBox1.Height);
            g.DrawRectangle(drawPen, rectangle);
            g.FillRectangle(Brushes.Green, rectangle);
 
            SrcImg = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = SrcImg;
 
            drawPen.Dispose();
            g.Dispose();
Само сохранение
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
saveFileDialog1.Filter = "PNG(*.png)|*.png";
 
            saveFileDialog1.Title = "Сохранить как...";
            saveFileDialog1.OverwritePrompt = true;
            saveFileDialog1.CheckPathExists = true;
 
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string FileName = saveFileDialog1.FileName;
                string FileExt = FileName.Remove(0, FileName.Length - 3);
                SrcImg = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
                
                switch (FileExt)
                {
                    case "png":
                        SrcImg.Save(FileName, ImageFormat.Png);
                        break;
                    default:
                        break;
                }
            }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.04.2015, 11:16
Ответы с готовыми решениями:

Слои в picturebox
Здраствуйте. Пишу графический редактор. Рисую на bitmap который потом переношу в picturebox(picturebox.Image = bmp) И понятия не имею как...

Как сделать на сайте возможность обработки изображений или фотографий
Ну там загрузил, поправил и отправил на почту или поделитесь интересными ссылками на тему., заранее спасибо)

PictureBox вне границ формы или как сделать прозрачный фон
Здраствуйте, подскажите пожалуйста, как можно сделать изображение больше размера основной формы + чтобы имг оставался поверх формы и был...

15
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
21.04.2015, 11:43
C#
1
g.Clear(Color.Red); // для Graphics
1
0 / 0 / 1
Регистрация: 20.04.2015
Сообщений: 44
21.04.2015, 12:03  [ТС]
Цитата Сообщение от Sanya_sa Посмотреть сообщение
g.Clear(Color.Red); // для Graphics
Да, но он же очищает область всю. А мне надо по сути дела только фон менять и сохранять уже начертанные линии
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
21.04.2015, 12:32
Тогда создайте Graphics для фона (ну типо дополнительный слой), можно и по другомо. Например закрашивать фон перед рисованием (линий , пря-ов итп). Какой вариант Вам подойдет не могу сказать тк не вижу всего кода.
0
0 / 0 / 1
Регистрация: 20.04.2015
Сообщений: 44
21.04.2015, 14:04  [ТС]
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Тогда создайте Graphics для фона (ну типо дополнительный слой), можно и по другомо. Например закрашивать фон перед рисованием (линий , пря-ов итп). Какой вариант Вам подойдет не могу сказать тк не вижу всего кода.
Ну вот код мой, я просто что-то понять не могу как совмещать эти графики...
Кликните здесь для просмотра всего текста
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
private Point startPoint;
        private Color color = Color.White;
        private Graphics g;
        private Pen drawPen;
        private Bitmap SrcImg;
 
        public Form1()
        {
            InitializeComponent();
            SrcImg = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = SrcImg;
        }
 
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            startPoint = e.Location;
        }
        private void цToolStripMenuItem_Click(object sender, EventArgs e)
        {
            colorDialog1.AllowFullOpen = true;
            colorDialog1.FullOpen = true;
            colorDialog1.ShowHelp = true;
 
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                color = colorDialog1.Color;
            }
        }
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                g = Graphics.FromImage(pictureBox1.Image);
                drawPen = new Pen(color, 1);
                
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                g.DrawLine(drawPen, startPoint, e.Location);
                startPoint = e.Location;
 
                SrcImg = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
                pictureBox1.Image = SrcImg;
 
                drawPen.Dispose();
                g.Dispose();
            }
        }
 
        private void сОХРToolStripMenuItem_Click(object sender, EventArgs e)
        {
            saveFileDialog1.Filter = "PNG(*.png)|*.png";
 
            saveFileDialog1.Title = "Сохранить как...";
            saveFileDialog1.OverwritePrompt = true;
            saveFileDialog1.CheckPathExists = true;
 
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string FileName = saveFileDialog1.FileName;
                string FileExt = FileName.Remove(0, FileName.Length - 3);
                SrcImg = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
                
                switch (FileExt)
                {
                    case "png":
                        SrcImg.Save(FileName, ImageFormat.Png);
                        break;
                    default:
                        break;
                }
            }
        }
        private void зАЛИВToolStripMenuItem_Click(object sender, EventArgs e)
        {
            g = Graphics.FromImage(pictureBox1.Image);
            g.Clear(Color.Green);
            SrcImg = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = SrcImg;
            g.Dispose();
        }
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
21.04.2015, 14:16
Лучший ответ Сообщение было отмечено mepihin как решение

Решение

Ну в Вашем случаи можно такт сделать.
Вложения
Тип файла: 7z DGV.7z (29.2 Кб, 25 просмотров)
1
0 / 0 / 1
Регистрация: 20.04.2015
Сообщений: 44
21.04.2015, 14:47  [ТС]
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Ну в Вашем случаи можно такт сделать.
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Ну в Вашем случаи можно такт сделать.
А почему фон только 1 раз срабатывает? Я делаю диалог выбора цвета
C#
1
2
3
4
5
6
7
8
9
10
11
12
private Color backgroundcolor = Color.Black;
private void заднийЦветToolStripMenuItem_Click(object sender, EventArgs e)
        {
            colorDialog1.AllowFullOpen = true;
            colorDialog1.FullOpen = true;
            colorDialog1.ShowHelp = true;
 
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                backgroundcolor = colorDialog1.Color;
            }
        }
Потом делаю функцию заливки.
C#
1
2
3
4
5
6
7
private void зАЛИВToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Graphics gf = Graphics.FromImage(pictureBox1.BackgroundImage);
            gf.Clear(backgroundcolor);
            SrcImg = new Bitmap(pictureBox1.BackgroundImage, pictureBox1.Width, pictureBox1.Height);
            pictureBox1.BackgroundImage = SrcImg;
        }
Добавлено через 2 минуты
Решил задачу, надо было просто
C#
1
2
SrcImg = new Bitmap(pictureBox1.BackgroundImage, pictureBox1.Width, pictureBox1.Height);
            pictureBox1.BackgroundImage = SrcImg;
В начало поставить
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
21.04.2015, 14:48
Ну так вот тут gf.Clear(Color.Red); и задайте его. Я код для примера только использую что бы принцип показать.
0
0 / 0 / 1
Регистрация: 20.04.2015
Сообщений: 44
21.04.2015, 15:09  [ТС]
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Ну так вот тут gf.Clear(Color.Red); и задайте его. Я код для примера только использую что бы принцип показать.
Программа сохраняет, только последнее действие... Почему так?
Кликните здесь для просмотра всего текста
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
private Point startPoint;
        private Color color = Color.White, backgroundcolor = Color.Black;
        private Graphics g, gf;
        private Pen drawPen;
        private Bitmap SrcImg;
 
        public Form1()
        {
            InitializeComponent();
            SrcImg = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = SrcImg;
            pictureBox1.BackgroundImage = SrcImg;
        }
        private void оснцветToolStripMenuItem_Click(object sender, EventArgs e)
        {
            colorDialog1.AllowFullOpen = true;
            colorDialog1.FullOpen = true;
            colorDialog1.ShowHelp = true;
 
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                color = colorDialog1.Color;
            }
        }
 
        private void заднийЦветToolStripMenuItem_Click(object sender, EventArgs e)
        {
            colorDialog1.AllowFullOpen = true;
            colorDialog1.FullOpen = true;
            colorDialog1.ShowHelp = true;
 
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                backgroundcolor = colorDialog1.Color;
            }
        }
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            startPoint = e.Location;
        }
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                g = Graphics.FromImage(pictureBox1.Image);
                drawPen = new Pen(color, 1);
                
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                g.DrawLine(drawPen, startPoint, e.Location);
                startPoint = e.Location;
 
                SrcImg = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
                pictureBox1.Image = SrcImg;
 
                drawPen.Dispose();
                g.Dispose();
            }
        }
        private void зАЛИВToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SrcImg = new Bitmap(pictureBox1.BackgroundImage, pictureBox1.Width, pictureBox1.Height);
            pictureBox1.BackgroundImage = SrcImg;
            gf = Graphics.FromImage(pictureBox1.BackgroundImage);
            gf.Clear(backgroundcolor);
        }
        private void сОХРToolStripMenuItem_Click(object sender, EventArgs e)
        {
            saveFileDialog1.Filter = "PNG(*.png)|*.png";
 
            saveFileDialog1.Title = "Сохранить как...";
            saveFileDialog1.OverwritePrompt = true;
            saveFileDialog1.CheckPathExists = true;
 
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string FileName = saveFileDialog1.FileName;
                string FileExt = FileName.Remove(0, FileName.Length - 3);
                SrcImg = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
                
                switch (FileExt)
                {
                    case "png":
                        SrcImg.Save(FileName, ImageFormat.Png);
                        break;
                    default:
                        break;
                }
            }
        }
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
21.04.2015, 16:00
"только последнее действие" - в смысле последнюю отрисовку.
Вы бы описали чего хотите добится а я подсказал бы. Так проще будет.
0
0 / 0 / 1
Регистрация: 20.04.2015
Сообщений: 44
21.04.2015, 16:15  [ТС]
Цитата Сообщение от Sanya_sa Посмотреть сообщение
"только последнее действие" - в смысле последнюю отрисовку.
Вы бы описали чего хотите добится а я подсказал бы. Так проще будет.
Я хочу сделать рисование по pictureBox и сделать заливку фона. Потом это в картинку сохранить.

Да, именно последнее действие, то есть если будет действие заливка, то она сохраниться, если после нее рисую линии свободные, то они сохраняются.
Короче либо фон либо линии.

А надо, чтобы сохранилось все, что есть pictureBox1.
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
21.04.2015, 22:27
Ну правильно у pictureBox есть BackgroundImage и Image
BackgroundImage - это фон у Вас
Image - это рисунок
0
0 / 0 / 1
Регистрация: 20.04.2015
Сообщений: 44
21.04.2015, 22:41  [ТС]
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Ну правильно у pictureBox есть BackgroundImage и Image
BackgroundImage - это фон у Вас
Image - это рисунок
Так как сохранять это как единое целое?
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
21.04.2015, 23:03
Коментарии оставил в коде. Чи тайте MSDN. Эксперементируйте и всё получится.
Вложения
Тип файла: rar line.rar (51.3 Кб, 14 просмотров)
0
0 / 0 / 1
Регистрация: 20.04.2015
Сообщений: 44
21.04.2015, 23:11  [ТС]
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Коментарии оставил в коде. Чи тайте MSDN. Эксперементируйте и всё получится.
Вы меня немножко не поняли. Мне надо менять цвет фона при этом не сбрасывая все то, что нарисовали ранее
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
21.04.2015, 23:21
В таком случаи подход к рисованию не верный.
Вижу два варианта :

1) (более правильный) сохранять все параметры отрисованых фигур в массив и при добавлении нового элемента на холст отрисовывать все фигуры которые в массиве. Плюсов в данном подходе масса )

2) рисовать фон в одном BitMape фигуры в другом, при чем там где рисуем фигуры фон должен быть альфой. При сохранении отрисовывать на фоновом битмапе тот что с фигурами используя DrawImage
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2015, 23:21
Помогаю со студенческими работами здесь

Как сделать так, чтобы рисунки не исчезали с picturebox при сворачивании или сохранении?
Здравствуйте. Есть Windows Form, в которой - PictureBox. На нем все рисуется, как перенести рисунок на Bitmap? Знаю, на контролах нельзя...

Как сделать так чтобы данные из dateTimePicker или textbox отрисовались на изображении в picturebox
Подскажите, если это возможно

Слои в HTML или как заставить заработать z-index?
Добрый день! Всех с Рождеством! :) Подскажите, по какой причине не работает z-index на демо-странице? Там зелёный блок должен...

Напряженность в центре плоского кольца(бублик), шаровые слои или как дальше жить?
Дана задача(цитата): - По шаровому слою с внешним радиусом R1 = 5 см и внутренним радиусом R2 = 10 см равномерно распределен заряд с...

Прозрачность фона PictureBox
Как фон pictureBox сделать прозрачным? Ставлю backcolor - Transparent, но так не работает. В чем причина?


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru