Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Элементы управления OpenFileDialog и SaveFileDialog

Отображение графических файлов

Обычно для отображения точечных рисунков, рисунков из метафайлов, значков, рисунков из файлов в формате BMP, JPEG, GIF или PNG используется объект PictureBox, т.е. элемент управления PictureBox действует как контейнер для картинок. Можно выбрать изображение для вывода, присвоив значение свойству Image. Свойство Image может быть установлено в окне свойств или в коде программы, указывая на рисунок, который следует отображать.

Элемент управления PictureBox содержит и другие полезные свойства, в том числе свойство AutoSize, определяющее, будет ли изображение растянуто в элементе PictureBox, и SizeMode, которое может использоваться для растягивания, центрирования или увеличения изображения в элементе управления PictureBox.

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

Необходимо отметить, что поле Image само является классом для работы с изображениями, у которого есть свои методы. Например, метод FromFile используется для загрузки изображения из файла. Кроме класса Image существует класс Bitmap, который расширяет возможности класса Image за счет дополнительных методов для загрузки, сохранения и использования растровых изображений. Так метод Save класса Bitmap позволяет сохранять изображения в разных форматах, а методы GetPixel и SetPixel позволяют получить доступ к отдельным пикселям рисунка.

 

Элемент управления OpenFileDialog является стандартным диалоговым окном. Он аналогичен диалоговому окну «Открыть файл» операционной системы Windows. Элемент управления OpenFileDialog позволяет пользователям просматривать папки личного компьютера или любого компьютера в сети, а также выбирать файлы, которые требуется открыть.

Для вызова диалогового окна для выбора файла можно использовать метод ShowDialog() который возвращает значение DialogResult.OK при корректном выборе. Диалоговое окно возвращает путь и имя файла, который был выбран пользователем в специальном свойстве FileName.

 

Создайте приложение, реализующее простой графический редактор. Функциями этого редактора должны быть: открытие рисунка, рисование поверх него простой кистью, сохранение рисунка в другой файл. Для этого создайте форму и разместите на ней элементы управления 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) Расширьте приложение путем добавления возможности выбора пользователем цвета и величины кисти.

2) Разработайте функцию, добавляющую на изображение 1000 точек с координатами заданными случайным образом. Цвет, также, задается случайным образом.

3) Создайте функцию, переводящую изображение в черно-белый формат. Пороговое значение задавать с помощью элемента управления TrackBar.

4) Разработайте функцию, оставляющую на изображении только один из каналов (R, G, B). Канал выбирается пользователем.

5) Создайте функцию, выводящую на изображение окружность. Центр окружности совпадает с центром изображения. Все точки вне окружности переводятся в градации серого цвета. Все точки внутри окружности остаются неизменными. Радиус окружности задается пользователем.

6) Создайте функцию, выводящую на изображение треугольник. Для всех точек вне треугольника оставьте только канал B. Все точки внутри треугольника переводятся в градации серого цвета.

7) Создайте функцию, выводящую на изображение ромб. Все точки вне ромба переводятся в градации серого цвета. Для всех точек внутри ромба оставьте только канал G.

8) Разработайте функцию, которая каждую четную строку изображения переводит в градации серого цвета.

9) Разработайте функцию, которая переводит каждый нечетный столбец пикселей (вертикальные линии) в градации серого цвета.

10) Создайте функцию, разбивающую изображение на четыре равные части. В каждой оставьте значение только одного канала R, G и B, а в четвертой выведите градации серого цвета.

11) Разработайте функцию, заменяющую все точки синего цвета на точки красного цвета.

12) Создайте функцию, инвертирующую изображение в градациях серого цвета в негатив.

13) Создайте функцию, изменяющую яркость изображения. Путем прибавления или уменьшения заданной пользователем величины к каждому каналу.

14) Создайте функцию, переводящую изображение в черно-белый формат в соответствии с пороговым значением, которое ввел пользователь. Для анализа используйте только один из каналов (R, G, B).

15) Разработайте функцию для создания эффекта мозаики. При этом изображения разбивается на прямоугольные фрагменты, в каждом из которых выбирается цвет средней точки и этим же цветом закрашивается весь фрагмент.

16) Разработайте функцию, разбивающую изображение на фрагменты, в каждом из которых остается только один из каналов (R, G, B).

 

Лабораторная работа №13
Методы

Цель лабораторной работы: научиться работать с методами, написать программу с использованием методов.




Поделиться с друзьями:


Дата добавления: 2014-11-07; Просмотров: 2339; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.242 сек.