Простой графический редактор
Создайте приложение, реализующее простой графический редак- тор. Функциями этого редактора должны быть: открытие рисунка, рисо- вание поверх него простой кистью, сохранение рисунка в другой файл. Для этого создайте форму и разместите на ней элементы управления Button и PictureBox (рис 12.1).
В этом случае не понадобится из панели элементов размещать на форме элементы диалоговых окон OpenFileDialog и SaveFileDialog.
![]() |
3 В приложениях Visual C# часто содержатся данные, не являющиеся исходным кодом. Такие данные называются ресурсами проекта и могут включать двоичные данные, текстовые файлы, аудио- и видеофайлы, таблицы строк, значки, изображения, XML-файлы или любой другой тип данных, не- обходимых для приложения. Данные ресурсов проекта хранятся в формате XML в файле с расширени- ем RESX (имя по умолчанию – Resources.resx), который можно открыть в Обозревателе решений.
Эти элементы будут порождены динамически в ходе выполнения про- граммы с помощью конструктора. Например, так:
OpenFileDialog dialog = new OpenFileDialog();
Далее они будут вызываться с помощью метода ShowDialog().
Для кнопок «Открыть» и «Сохранить» создайте свои обработчики события. Также создайте обработчик события Load для формы. Для эле- мента управления pictureBox1 создайте обработчики события MouseDown, MouseMove.
![]() |
Рис. 12.1. Форма для графического редактора
Код приложения будет выглядеть следующим образом:
// Глобальные переменные
private Point PreviousPoint, point; private Bitmap bmp;
private Pen blackPen; private Graphics g;
// Действия при загрузке формы
private void Form1_Load(object sender, EventArgs e)
{
// Подготавливаем перо для рисования blackPen = new Pen(Color.Black, 4);
}
// Действия при нажатии кнопки загрузки изображения private void button1_Click(object sender, EventArgs e)
{
// Описываем объект класса OpenFileDialog OpenFileDialog dialog = new OpenFileDialog();
// Задаем расширения файлов
dialog.Filter = "Image files (*.BMP, *.JPG, " + "*.GIF, *.PNG)|*.bmp;*.jpg;*.gif;*.png";
// Вызываем диалог и проверяем выбран ли файл if (dialog.ShowDialog() == DialogResult.OK)
{
// Загружаем изображение из выбранного файла
Image image = Image.FromFile(dialog.FileName); int width = image.Width;
int height = image.Height; pictureBox1.Width = width; pictureBox1.Height = height;
// Создаем и загружаем изображение в формате bmp bmp = new Bitmap(image, width, height);
// Записываем изображение в pictureBox1 pictureBox1.Image = bmp;
// Подготавливаем объект Graphics для рисования g = Graphics.FromImage(pictureBox1.Image);
}
}
// Действия при нажатии мышки в pictureBox1 private void pictureBox1_MouseDown(object sender,
MouseEventArgs e)
{
// Записываем в предыдущую точку текущие координаты PreviousPoint.X = e.X;
PreviousPoint.Y = e.Y;
}
// Действия при перемещении мышки
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
// Проверяем нажата ли левая кнопка мыши if (e.Button == MouseButtons.Left)
{
// Запоминаем текущее положение курсора мыши point.X = e.X;
point.Y = e.Y;
// Соеденяем линией предыдущую точку с текущей g.DrawLine(blackPen, PreviousPoint, point);
// Текущее положение курсора - в PreviousPoint PreviousPoint.X = point.X;
PreviousPoint.Y = point.Y;
// Принудительно вызываем перерисовку pictureBox1.Invalidate();
}
}
// Действия при нажатии кнопки сохранения файла private void button2_Click(object sender, EventArgs e)
{
// Описываем и порождаем объект savedialog SaveFileDialog savedialog = new SaveFileDialog();
// Задаем свойства для savedialog savedialog.Title = "Сохранить картинку как ..."; savedialog.OverwritePrompt = true; savedialog.CheckPathExists = true; savedialog.Filter =
"Bitmap File(*.bmp)|*.bmp|" + "GIF File(*.gif)|*.gif|" + "JPEG File(*.jpg)|*.jpg|" + "PNG File(*.png)|*.png";
// Показываем диалог и проверяем задано ли имя файла if (savedialog.ShowDialog() == DialogResult.OK)
{
string fileName = savedialog.FileName;
// Убираем из имени расширение файла string strFilExtn = fileName.Remove(0,
fileName.Length - 3);
// Сохраняем файл в нужном формате switch (strFilExtn)
{
case "bmp":
bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp); break;
case "jpg":
bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
break; case "gif":
bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Gif); break;
case "tif":
bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Tiff);
break; case "png":
bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Png); break;
default:
break;
}
}
}
Далее добавим в проект кнопку для перевода изображения в града- ции серого цвета:
// Действия при нажатии кнопки перевода в градации серого private void button3_Click(object sender, EventArgs e)
{
// Циклы для перебора всех пикселей на изображении for (int i = 0; i < bmp.Width; i++)
for (int j = 0; j < bmp.Height; j++)
{
// Извлекаем в R значение красного цвета int R = bmp.GetPixel(i, j).R;
// Извлекаем в G значение зеленого цвета int G = bmp.GetPixel(i, j).G;
// Извлекаем в B значение синего цвета int B = bmp.GetPixel(i, j).B;
// Высчитываем среднее арифметическое int Gray = (R + G + B) / 3;
// Переводим число в значение цвета.
// 255 – показывает степень прозрачности.
// Остальные значения одинаковы
Color p = Color.FromArgb(255, Gray, Gray, Gray);
// Записываем цвет в текущую точку bmp.SetPixel(i, j, p);
}
// Вызываем функцию перерисовки окна Refresh();
}
Данный код демонстрирует возможность обращения к отдельным пикселям. Цвет каждого пикселя хранится в модели RGB и состоит из трех составляющих: красного, зеленого и синего цвета, называемых ка- налами. Значение каждого канала может варьироваться в диапазоне от 0 до 255.
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.