31868

Редагування растрових зображень

Лабораторная работа

Информатика, кибернетика и программирование

У класі форми обявити обєкти доступні для різних методів PictureBox pictureBox1; Lbel lbel1; Point spotClicked; 6.Size = new Size640 480; Завантажити малюнок в елемент PictureBox і вставити у форму додати до проекту відповідну папку з малюнком або вказати адресу малюнка pictureBox1 = new PictureBox; pictureBox1.jpg ; pictureBox1.SizeMode = PictureBoxSizeMode.

Украинкский

2013-09-01

74.5 KB

3 чел.

Лабораторна робота 2. Редагування растрових зображень

Завдання 1. Створення додатку для редагування растрових зображень (затемнення та підсвічування у вибраній ділянці малюнка)  у режимі перегляду кода з реакцією на події користувача

 

Методи, що працюють з мишею

OnClick(EventArgs e)

Виконане клацання кнопкою миші.

OnDoubleClick(EventArgs e)

 Виконане подвійне клацання кнопкою миші.

OnMouseDown(MouseEventArgs e)

Натиснута ліва кнопка миші.

OnMouseHover(MouseEventArgs e)

Покажчик миші зупинений десь після переміщення.

OnMouseMove(MouseEventArgs e)

Покажчик миші переміщений.

OnMouseUp(MouseEventArgs e)

Відпущена ліва кнопка миші

 

Методи, що працюють з клавіатурою

OnKeyDown(KeyEventArgs e)

Клавіша натиснута.

OnKeyPress(KeyPressEventArgs e)

Клавіша натиснута і відпущена.

OnKeyUp(KeyEventArgs e)

Натиснута клавіша відпущена.

 

 

1. Створити новий проект Windows Forms ( власне ім'я + lab2+1).

2. Знищити файл Form1.cs

3. Відредагувати файл Program.cs

 

using System;

using System.Windows.Forms;

namespace назва проекту

{

public class MyForm : System.Windows.Forms.Form

{

public MyForm()

{

}

[STAThread]

static void Main()

{

Application.Run(new MyForm());

}

}

}

 

4.Забезпечити використання простору імен System.Drawing, що містить більшість класів, структур, перерахувань і делегатів, які забезпечують базову функціональність малювання.

 

using System.Drawing;

 

 

5. У  класі форми об'явити об'єкти, доступні для різних методів

 

  PictureBox pictureBox1;

  Label label1;

  Point spotClicked;

 

6. До конструктора форми додати:

Розміри вікна

   

    this.Size = new Size(640, 480);

   

Завантажити малюнок в елемент PictureBox і вставити у форму (додати до проекту відповідну папку з малюнком, або вказати адресу малюнка)

   

    pictureBox1 = new PictureBox();

    pictureBox1.Image = (Image)new Bitmap(@"../../images/Водяные лилии.jpg");

    pictureBox1.SizeMode = PictureBoxSizeMode.Normal;

    pictureBox1.Dock = DockStyle.Fill;

    this.Controls.Add(pictureBox1);

   

Додати мітку з інструкціями в нижню частину екрану

   

    label1 = new Label();

    label1.BackColor = Color.Wheat;

    label1.Dock = DockStyle.Bottom;

    label1.Text =

    "При натисненій лівій кнопці миші можна збільшити яскравість виділеного прямокутника" +

    "Натиснута права кнопка зменшує яскравість прямокутника ";

    label1.TextAlign = ContentAlignment.MiddleCenter;

    this.Controls.Add(label1);

   

Прив'язати PictureBox до обробників подій миші

   

    this.pictureBox1.MouseDown += new MouseEventHandler(MouseButtonIsDown);

    this.pictureBox1.MouseUp += new MouseEventHandler(MouseButtonIsUp);

 

7. До класу форми додати

 

Обробник події, що спрацьовує  при натисненні кнопки миші

 

public void MouseButtonIsDown(object sender, MouseEventArgs e)

{

  // Запам'ятовуємо точку, в якій відбулося натиснення кнопки миші.

  // Коли кнопка буде відпущена - запам'ятати її координати

 

  spotClicked.X = e.X;// горизонтальна координата

  spotClicked.Y = e.Y;// вертикальна координата

}

 

Обробник подій, що спрацьовує при ВІДЖИМАННІ кнопки миші

 

 

public void MouseButtonIsUp(object sender, MouseEventArgs e)

{

  // Користувач відпустив кнопку миші

 

  // Створюємо прямокутник , що обмежує

  // область зображення, з якою користувач працюватиме

 

  Rectangle r = new Rectangle();

 

  // Лівий верхній кут прямокутника відповідає точці

  // у якій була натиснута кнопка миші.

 

  r.X = spotClicked.X;

  r.Y = spotClicked.Y;

 

  // Ширина і висота прямокутника обчислюється

  // шляхом віднімання координат миші в точці натиснення

  // з поточних координат (у точці віджимання кнопки).

 

  r.Width = e.X – spotClicked.X;

  r.Height = e.Y – spotClicked.Y;

 

  if (e.Button == MouseButtons.Left)

  {

    /* Якщо була натиснута і відпущена ліва кнопка миші

    викликаємо метод, що підсвічує область зображення */

    ChangeLightnessL(r);

   

  else

  {

    // Якщо була натиснута права кнопка, викликаємо

    // метод, що затемнює  область зображення

   

    ChangeLightnessR(r);

  }

}

 

Додати метод, що збільшує яскравість вибраної ділянки зображення

шляхом збільшення яскравості кожного пікселя цієї ділянки

public void ChangeLightnessL(Rectangle rect)

{

  int newRed, newGreen, newBlue;

  Color pixel;

 

  // Копіюємо зображення, завантажене в PictureBox

 

  System.Drawing.Bitmap picture = new

  Bitmap(this.pictureBox1.Image);

 

  // Операція збільшення яскравості може зайняти багато часу

  // користувача попереджають, якщо вибрана велика ділянка.

 

  if ((rect.Width > 150) || (rect.Height > 150))

  {

   

    DialogResult result = MessageBox.Show(

    "Виділена область велика! " +

    "Зміна яскравості може вимагати значного часу!",

    "Warning", MessageBoxButtons.OKCancel);

   

    // При натисненні кнопки Cancel (Відміна) виходимо з методу

    // і повертаємося до місця його виклику

   

    if (result == DialogResult.Cancel) return;

  }

  /* Перебираємо послідовно всі пікселі даної ділянки

  і подвоюємо значення яскравості компонент RGB пікселів */

 

  // Перебір по горизонталі зліва направо...

 

  for (int x = rect.X; x < rect.X + rect.Width; x++)

  {

    // і по вертикалі зверху вниз...

   

    for (int у = rect.Y; у < (rect.Y + rect.Height); y++)

    {

      // Прочитуємо поточний піксель

     

      pixel = picture.GetPixel(x, у);

     

      // Збільшуємо яскравість колірних компонент пікселя

     

      newRed = (int)Math.Round(pixel.R * 2.0, 0);

      if (newRed > 255) newRed = 255;

      newGreen = (int)Math.Round(pixel.G * 2.0, 0);

      if (newGreen > 255) newGreen = 255;

      newBlue = (int)Math.Round(pixel.B * 2.0, 0);

      if (newBlue > 255) newBlue = 255;

     

      // Привласнюємо пікселю нові колірні значення

     

      picture.SetPixel

      (x, у, Color.FromArgb(

      (byte)newRed, (byte) newGreen, (byte) newBlue));

    }

  }

  // Поміщаємо змінену копію зображення в PictureBox

  // щоб зміни відобразилися на екрані

 

  this.pictureBox1.Image = picture;

  }

 

Метод, що зменшує яскравість вибраної ділянки зображення

шляхом зменшення яскравості кожного пікселя цієї ділянки ChangeLightnessR

написати самостійно

 

8. Відкомпілювати і запустити проект

 

Завдання 2. Виведення графічних зображень у режимі дизайну . Вивести власне зображення

 

1. Створити проект DisplayImage+ власне ім'я

2. Додати до класу Form1 поля

 

readonly Image piccy;

private readonly Point [] piccyBounds;

 

В конструкторі Form1 завантажити файл

 

public Form1()

{

InitializeComponent();

piccy = Image.FromFile(@"шлях до файлу");

AutoScrollMinSize = piccy.Size;

piccyBounds = new Point[3];

piccyBounds[0] = new Point(0,0); // верхній лівий

piccyBounds[1] = new Point(piccy.Width,0); // верхній правий

piccyBounds[2] = new Point(0,piccy.Height); // нижній лівий

}

 

 

Додати перевизначений метод OnPaint():

 

protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint(e);

Graphics dc = e.Graphics;

dc.ScaleTransform(1.0f, 1.0f);

dc.TranslateTransform(AutoScrollPosition.X, AutoScrollPosition.Y);

dc.DrawImage(piccy, piccyBounds);

}

 

Внести зміни до згенерованого IDE коду метода Form1.

Dispose():

 

protected override void Dispose(bool disposing)

{

piccy.Dispose();

if( disposing && (component != null))

{

components.Dispose();

}

base.Dispose(disposing );

}

 

Завдання 3. Змінити виведення зображення (використовуючи відповідні координати) :

-зменшити пропорційно зображення

-зменшити у 2 рази по вертикалі (стиснути)

-зменшити у 2 рази по горизонталі (розтягти)

 

 

 


 

А также другие работы, которые могут Вас заинтересовать

26355. Третий этап революции. 1793-1794 г. Якобинская диктатура 14.23 KB
  Был ее высшим этапом якобинской диктатурой. Складывавшаяся в ходе напряженной классовой борьбы система якобинской диктатуры сочетала сильную и твердую централизованную власть с идущей снизу широкой народной инициативой. Революционная инициатива масс в период якобинской диктатуры проявилась особенно ярко. Но в самой якобинской диктатуре и в якобинском блоке объединявшем классово разнородные элементы были заложены глубокие внутренние противоречия.
26356. Кризис Якобинской диктатуры и переворот 9 термидора 1794 г 19.66 KB
  Переворот был предпринят группой якобинцевчленов Конвента недовольных политикой Робеспьера и прежде всего по разным причинам опасавшихся за свою личную безопасность. Конвент постановил напечатать речь Робеспьера но Бурдон из Уазы а за ним БийоВаренн потребовали предварительного рассмотрения её комитетами. У Робеспьера потребовали чтобы он назвал имена обвиняемых но он отказался. 27 июля 9 термидора заседание Конвента началось с доклада СенЖюста но председательствующий Колло дЭрбуа прервал его и предоставил слово БийоВаренну...
26357. Франция в годы термидорианской реакции 17.5 KB
  якобинский клуб был закрыт по постановлению Конвента. Термидорианцы поспешили ликвидировать социальноэкономическое законодательство якобинского Конвента. Восставшим удалось захватить здание Конвента. 4 прериаля после ожесточенной борьбы восстание было подавлено вооруженными силами термидорианского Конвента.
26358. Внутренняя и внешняя политика Директории 23.16 KB
  правительственные войска заняли здания Совета пятисот и Совета старейшин и арестовали часть депутатов. Они били войска Австрийской империи и ее союзников в которых царила рутина насаждавшаяся спесивыми бездарными военачальниками. Основные удары по австрийским войскам нанесла французская армия в Северной Италии под командованием Бонапарта. 10 мая он разбил австрийские войска в сражении при Лоди вошел в Милан и вскоре приступил к осаде главной австрийской военной базы крепости Мантуи.
26359. Государственный переворот 18 брюмера 1799 г. Итоги революции 18.89 KB
  Сийес распустил слух об опасном якобинском заговоре и устроил так что те депутаты совета старейшин на которых он не рассчитывал или которых боялся не попали на заседание в котором предполагалось принять задуманные заговорщиками решения. Собравшиеся депутаты единогласно вотировали перенесение законодательного корпуса в СенКлу где оба совета должны были собраться на другой день не ранее полудня. Бонапарт окружённый генералами и офицерами немедленно отправился на заседание совета где произнес короткую речь с обещанием поддерживать...
26360. Бранденбургско-прусское государство во вт.пол. XVII- первой трети XVIII в. 29.76 KB
  XVII первой трети XVIII в. Социальноэкономическое и политическое развитие Германии в XVIII в. Борьба Пруссии и Австрии за гегемонию в Центральной Европе Господство крепостного права Мекленбург Бранденбург Померания Восточная Пруссия Силезия оставались в XVIII в. Сгон крестьян с земли принимает все более широкие размеры со второй половины XVIII в.
26361. Фридрих II и просвещённый абсолютизм в Пруссии 27.52 KB
  Фридрих II и просвещённый абсолютизм в Пруссии. Фри́дрих II или Фридрих Великий известный также как по прозвищу Старый Фриц нем. Фридрих родился в Берлине 24 января 1712 года при крещении получил имя КарлФридрих. Его отец король Пруссии Фридрих Вильгельм I из династии Гогенцоллернов мать София Доротея Ганноверская дочь короля Англии Георга I.
26362. Просвещенный абсолютизм в Австрии. Реформы Марии-Терезии и Иосифа II 15.02 KB
  Реформы МарииТерезии и Иосифа II. Правление Иосифа II 178090 Сын Марии Терезии Иосиф II ставший соправителем своей матери после 1765 часто вступал с ней в споры по вопросам государственной политики. Демонстрируя просвещенность и добрую волю Иосиф II провозгласил равенство всех подданных перед судом и при сборе налогов. Хотя Иосиф II объявил себя защитником католичества он вел энергичную борьбу с властью папы Римского.
26363. Итальянские войны 1494-1559 г 25.59 KB
  Французские войска вторглись в Италию подчинили Флоренцию и практически не встречая сопротивления в 1495 году заняли Неаполь. 6 июля 1495 года французские войска встретились с армией Венецианской лиги в сражении при Форново и не сумев добиться победы ушли во Францию. В 1496 году испанские войска очистили территорию Италии от французских гарнизонов остававшихся в крепостях а французский гарнизон в Неаполе капитулировал. В 1501 году французские войска вторглись на территорию Неаполя а испанский экспедиционный корпус высадился в Калабрии.