Лабораторный практикум по информатике


Простой графический редактор



бет54/83
Дата06.01.2022
өлшемі1,1 Mb.
#15674
түріПрактикум
1   ...   50   51   52   53   54   55   56   57   ...   83

Простой графический редактор


Создайте приложение, реализующее простой графический редак- тор. Функциями этого редактора должны быть: открытие рисунка, рисо- вание поверх него простой кистью, сохранение рисунка в другой файл. Для этого создайте форму и разместите на ней элементы управления Button и PictureBox (рис. 12.1).




Рис. 12.1. Форма для графического редактора

В этом случае не понадобится из панели элементов размещать на форме элементы диалоговых окон OpenFileDialog и SaveFileDialog. Эти элементы будут порождены динамически в ходе выполнения про- граммы с помощью конструктора. Например, так:

OpenFileDialog dialog = new OpenFileDialog();

Далее они будут вызываться с помощью метода ShowDialog().

Для кнопок «Открыть» и «Сохранить» создайте свои обработчики события. Также создайте обработчик события Load для формы. Для элемента управления pictureBox1 создайте обработчики события MouseDown, MouseMove.

Код приложения будет выглядеть следующим образом:

// Глобальные переменные

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.




Достарыңызбен бөлісу:
1   ...   50   51   52   53   54   55   56   57   ...   83




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет