Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

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





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

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

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

 

OpenFileDialog dialog = new OpenFileDialog();

 

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

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

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication1

{

public partial class Form1: Form

{ //Объявляем переменные доступные в каждом обработчике события

private Point PreviousPoint, point; //Точка до перемещения курсора мыши

//и текущая точка

private Bitmap bmp;

private Pen blackPen;

private Graphics g;

 

public Form1()

{

InitializeComponent();

}

 

private void Form1_Load(object sender, EventArgs e)

{

blackPen = new Pen(Color.Black, 4); //подготавливаем перо

}

 

private void button1_Click(object sender, EventArgs e)

{ //открытие файла

OpenFileDialog dialog = new OpenFileDialog();

//задаем расширения файлов

dialog.Filter = " Image files (*.BMP, *.JPG, *.GIF, *.TIF, *.PNG, *.ICO, *.EMF, *.WMF)|*.bmp; *.jpg; *.gif; *.tif; *.png; *.ico; *.emf; *.wmf";

if (dialog.ShowDialog() == DialogResult.OK)//вызываем диалоговое окно

{

Image image = Image.FromFile(dialog.FileName); //Загружаем в image

//изображение из выбранного файла

int width = image.Width;

int height = image.Height;

pictureBox1.Width = width;

pictureBox1.Height = height;

 

bmp = new Bitmap(image, width, height); //создаем и загружаем из

//image изображение в формате bmp

 

pictureBox1.Image = bmp; //записываем изображение в формате bmp

//в pictureBox1

g = Graphics.FromImage(pictureBox1.Image); //подготавливаем объект

//Graphics для рисования в pictureBox1

}

}

 

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

{ // обработчик события нажатия кнопки на мыши

// записываем в предыдущую точку (PreviousPoint) текущие координаты

PreviousPoint.X = e.X;

PreviousPoint.Y = e.Y;

}

 

 

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

{//Обработчик события перемещения мыши по pictuteBox1

if (e.Button == MouseButtons.Left) //Проверяем нажатие левой кнопка

{ //запоминаем в point текущее положение курсора мыши

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)

{ //сохранение файла

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|" +

" TIF File(*.tif)|*.tif|" +

" PNG File(*.png)|*.png";

savedialog.ShowHelp = true;

if (savedialog.ShowDialog() == DialogResult.OK)

{

// в fileName записываем полный путь к файлу

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++)

{

int R = bmp.GetPixel(i, j).R; //извлекаем долю красного цвета

int G = bmp.GetPixel(i, j).G; //извлекаем долю зеленого цвета

int B = bmp.GetPixel(i, j).B; //извлекаем долю синего цвета

int Gray = (R = G + B)/3; // высчитываем среднее

Color p = Color.FromArgb(255, Gray, Gray, Gray); //переводим int в значение цвета. 255 - показывает степень прозрачности. остальные значения одинаковы для трех каналов R, G, B

bmp.SetPixel(i, j, p); //записываем полученный цвет в точку

}

Refresh(); //вызываем функцию перерисовки окна

}

 

Данный код демонстрирует возможность обращения к отдельным пикселям. Цвет каждого пикселя хранится в модели RGB и состоит из трех составляющих: красного, зеленого и синего цвета, называемых каналами. Значение каждого канала может варьироваться в диапазоне от 0 до 255.







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




Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...


Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...


Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...


Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Случайной величины Плотностью распределения вероятностей непрерывной случайной величины Х называют функцию f(x) – первую производную от функции распределения F(x): Понятие плотность распределения вероятностей случайной величины Х для дискретной величины неприменима...

Схема рефлекторной дуги условного слюноотделительного рефлекса При неоднократном сочетании действия предупреждающего сигнала и безусловного пищевого раздражителя формируются...

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

Общая и профессиональная культура педагога: сущность, специфика, взаимосвязь Педагогическая культура- часть общечеловеческих культуры, в которой запечатлил духовные и материальные ценности образования и воспитания, осуществляя образовательно-воспитательный процесс...

Устройство рабочих органов мясорубки Независимо от марки мясорубки и её технических характеристик, все они имеют принципиально одинаковые устройства...

Ведение учета результатов боевой подготовки в роте и во взводе Содержание журнала учета боевой подготовки во взводе. Учет результатов боевой подготовки - есть отражение количественных и качественных показателей выполнения планов подготовки соединений...

Studopedia.info - Студопедия - 2014-2025 год . (0.013 сек.) русская версия | украинская версия