C#

Как размножить одну картинку на несколько в C# Windows Forms

В C# Windows Forms одну картинку можно вывести несколько раз через несколько PictureBox. Картинка хранится в объекте Image, а каждый PictureBox показывает ее в своем месте. Обычно делают цикл: создают новый PictureBox, задают Image, размер, координаты и добавляют на форму через Controls.Add

Базовый пример

Пусть на форме есть pictureBoxSource, в котором уже выбрана картинка. Создадим пять копий:

for (int i = 0; i < 5; i++)
{
    PictureBox box = new PictureBox
    {
        Image = pictureBoxSource.Image,
        Width = 80,
        Height = 80,
        SizeMode = PictureBoxSizeMode.Zoom,
        Left = 20 + i * 90,
        Top = 100,
        Tag = "generated"
    };

    Controls.Add(box);
}

Каждый PictureBox отдельный, но изображение у них одно и то же

Почему Image можно использовать несколько раз

Если вы просто показываете картинку, один объект Image можно назначить нескольким контролам. Это нормально: контролы не становятся одним и тем же объектом. Они только ссылаются на одно изображение. Но если вы собираетесь изменять картинку, рисовать на ней или освобождать ресурсы вручную, тогда нужно внимательнее управлять копиями

Для учебного сценария с одинаковыми значками, карточками или плитками достаточно одного Image и нескольких PictureBox

Перед созданием копий проверьте исходную картинку:

if (pictureBoxSource.Image == null)
{
    MessageBox.Show("Сначала выберите картинку");
    return;
}

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

Сетка картинок

Чтобы разместить картинки в несколько рядов:

int columns = 4;
int size = 70;
int gap = 12;

for (int i = 0; i < 12; i++)
{
    int row = i / columns;
    int column = i % columns;

    PictureBox box = new PictureBox
    {
        Image = pictureBoxSource.Image,
        Width = size,
        Height = size,
        SizeMode = PictureBoxSizeMode.Zoom,
        Left = 20 + column * (size + gap),
        Top = 20 + row * (size + gap),
        Tag = "generated"
    };

    Controls.Add(box);
}

Деление на строку и столбец помогает сделать галерею, игровое поле или набор товаров

Если картинка из ресурсов

Можно брать изображение из ресурсов проекта:

Image icon = Properties.Resources.ProductIcon;

А дальше назначать icon каждому PictureBox. Такой способ удобен, если картинка должна быть внутри приложения, а не лежать отдельным файлом рядом с .exe

Как очистить созданные картинки

Для удаления динамических элементов удобно использовать Tag:

foreach (Control control in Controls.Cast<Control>().ToList())
{
    if (control is PictureBox && control.Tag?.ToString() == "generated")
    {
        Controls.Remove(control);
        control.Dispose();
    }
}

Так удаляются только созданные программно картинки, а исходный pictureBoxSource остается

Частые ошибки

Первая ошибка — написать PictureBox copy = pictureBoxSource и ждать новую картинку. Это только новая ссылка на тот же контрол. Вторая — забыть Controls.Add. Третья — не задать размер или SizeMode. Четвертая — создавать сотни контролов, хотя для сложной графики лучше рисовать на Panel или использовать игровой подход

Мини-задача: сделайте кнопку «Показать 12 картинок» и кнопку «Очистить». Первая строит сетку 4 на 3, вторая удаляет только элементы с Tag = "generated"

Что почитать дальше по C#

Что почитать дальше по C#

Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x