М и н и стерство о бразования и науки днр — КиберПедия 

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

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

М и н и стерство о бразования и науки днр

2022-09-01 47
М и н и стерство о бразования и науки днр 0.00 из 5.00 0 оценок
Заказать работу

ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНІВЕРСИТЕТ

Факультет                        информационных систем и технологий

Кафедра                компьютерного моделирования и дизайна

Специальность        Информационные системы и технологии

 

УТВЕРЖДАНО:

зав. кафедрой КМД

Карабчевский В.В.

“___” _____________ 2021 г.

ТЕХНИЧЕСКОЕ ЗАДАНИЕ

на курсовую работу

по курсу «Методы и средства компьютерных информационных технологий»

Тема работы: «Разработка программных средств для просмотра графических файлов, создание графических эффектов»

 Студента группы МИД-18б Брегеды Андрея Васильевича

Срок сдачи: 12 неделя осеннего семестра 2021-2022 уч. года

 

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

2 Задачи работы:

¾ написать программу для просмотра файлов графического формата BMP;

¾ для данного формата реализовать разложение по базисам R G B;

¾ собрать по цветовому базису H L S;

¾ зашумить составляющую R и H;

¾ негатив изображения;

¾ cохранить как JPG;

3 Содержание пояснительной записки:

1) Введение

2) Сравнительный анализ графических форматов файлов

3) Проектирование интерфейса приложения (с диаграммами)

4) Открытие файла (блок-схемы)

5) Сохранение файла (блок-схемы)

6) Реализация эффектов (цветовые модели, описание, блок-схемы)

7) Тестирование работы приложения

8) Выводы

Задание принял к исполнению:

студент группы МИД-18б    Брегеда А. В.     ____________________        

Руководители проекта:

доц. каф. КМД                       Губенко Н. Е.      ____________________          

ст. пр. каф. КМД                    Киселёва О. В.      ____________________          

 

ПРИЛОЖЕНИЕ Б ЭКРАННЫЕ ФОРМЫ

Рисунок Б.1 – Окно программы

Рисунок Б.2 – Отображение загруженного BMP изображения в окно программы

Рисунок Б.3 – Негатив изображения в окне программы

Рисунок Б.4 – Изображение, собранное по базису HSL, в окне программы

 

Рисунок Б.5 – Изображения составляющих цветового базиса HSL в окне программы

Рисунок Б.6 – Изображения составляющих цветового базиса RGB в окне программы

Рисунок Б.7 – Изображение с зашумленной составляющей R в окне программы

Рисунок Б.8 – Изображение с зашумленной составляющей H в окне программы

 

ПРИЛОЖЕНИЕ В ЛИСТИНГ ПРОГРАММЫ

using System;

using System.Drawing;

using System.Windows.Forms;

 

namespace BMPprog

{

public partial class Form1: Form

{

   public Form1()

   {

       InitializeComponent();

   }

   private void OpenImageButton_Click(object sender, EventArgs e)

   {

       OpenFileDialog ImageDialog = new OpenFileDialog();

       ImageDialog.Filter = "Изображения(*.BMP)|*.BMP|Все файлы(*.*)|*.*";

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

       {

           try

           {

               SourcePictureBox.Image = new Bitmap(ImageDialog.FileName);

               SourcePictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

           }

           catch

           {

               MessageBox.Show("Невозможно открыть выбранный файл", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);

           }

       }

   }

   static Bitmap[] GetRgbChannels(Bitmap source)

   {

       Bitmap[] result = new Bitmap[] { new Bitmap(source.Width, source.Height), new Bitmap(source.Width, source.Height), new Bitmap(source.Width, source.Height) };

       for (int i = 0; i < source.Width; i++)

       {

           for (int j = 0; j < source.Height; j++)

           {

                 Color color = source.GetPixel(i, j);

               result[0].SetPixel(i, j, Color.FromArgb(color.A, color.R, 0, 0));

               result[1].SetPixel(i, j, Color.FromArgb(color.A, 0, color.G, 0));

               result[2].SetPixel(i, j, Color.FromArgb(color.A, 0, 0, color.B));

           }

       }

       return result;

   }

   public Bitmap NoiseR(Bitmap source)

   {

       Bitmap noise = new Bitmap(source.Width, source.Height);

       Random rnd = new Random();

       for (int i = 0; i < source.Width; i++)

       {

           for (int j = 0; j < source.Height; j++)

           {

               Color color = source.GetPixel(i, j);

               int R = color.R + trackBar1.Value;

               if (R>255)

               {

                   R %= 255;

               }

                   color = Color.FromArgb(R, color.G, color.B);

 

               noise.SetPixel(i, j, color);

           }

       }

       return noise;

   }

   public Bitmap NoiseH(Bitmap source)

   {

       Bitmap noise = new Bitmap(source.Width, source.Height);

 

       for (int i = 0; i < source.Width; i++)

       {

           for (int j = 0; j < source.Height; j++)

           {

               Color clr = source.GetPixel(i, j);

               double H = source.GetPixel(i, j).GetHue() + trackBar2.Value;

               if (H>360)

               {

                   H %= 360;

               }

               double c = (1 - Math.Abs(2 * source.GetPixel(i, j).GetBrightness() - 1)) * source.GetPixel(i, j).GetSaturation();

               double m = 1 * (source.GetPixel(i, j).GetBrightness() - 0.5 * c);

               double x = c * (1 - Math.Abs((H / 60) % 2 - 1));

               if (H>= 0 && H < 60)

               {

                   clr = Color.FromArgb((int)((c + m) * 255), (int)((x + m) * 255), (int)((m) * 255));

               }

               else if (H >= 60 && H < 120)

               {

                   clr = Color.FromArgb((int)((x + m) * 255), (int)((c + m) * 255), (int)(m * 255));

               }

               else if (H >= 120 && H < 180)

               {

                   clr = Color.FromArgb((int)(m * 255), (int)((c + m) * 255), (int)((x + m) * 255));

               }

               else if (H >= 180 && H < 240)

               {

                    clr = Color.FromArgb((int)(m * 255), (int)((x + m) * 255), (int)((c + m) * 255));

               }

               else if (H >= 240 && H < 300)

               {

                   clr = Color.FromArgb((int)((x + m) * 255), (int)(m * 255), (int)((c + m) * 255));

               }

               else if (H >= 300 && H < 360)

               {

                   clr = Color.FromArgb((int)((c + m) * 255), (int)(m * 255), (int)((x + m) * 255));

               }

               else

               {

                   clr = Color.FromArgb((int)(m * 255), (int)(m * 255), (int)(m * 255));

               }

               noise.SetPixel(i, j, clr);

           }

       }

       return noise;

   }

   public Bitmap Generate_negative_image(Bitmap source)

   {

       Bitmap negative = new Bitmap(source.Width, source.Height);

           

       for (int i = 0; i < source.Width; i++)

       {

           for (int j = 0; j < source.Height; j++)

           {

               Color color = source.GetPixel(i, j);

               color = Color.FromArgb(255 - color.R, 255 - color.G, 255 - color.B);

               negative.SetPixel(i, j, color);

           }

       }

       return negative;

   }

   Bitmap[] GetHLSChannels(Bitmap source)

   {

       Bitmap[] result = new Bitmap[] { new Bitmap(source.Width, source.Height), new Bitmap(source.Width, source.Height), new Bitmap(source.Width, source.Height), new Bitmap(source.Width, source.Height) };

       for (int i = 0; i < source.Width; i++)

       {

           for (int j = 0; j < source.Height; j++)

           {

                Color clr = source.GetPixel(i, j);

               Color color = source.GetPixel(i, j);

               double h, s, l;

               double r = color.R / 255.0;

               double g = color.G / 255.0;

               double b = color.B / 255.0;

               double cMin = Math.Min(r, Math.Min(g, b));

               double cMax = Math.Max(r, Math.Max(g, b));

               double delta = cMax - cMin;

               l = (cMax + cMin) / 2;

               if (cMax == cMin)

               {

                   s = 0;

                   h = 0;

               }

               else

               {

                   if (l <.5)

                   {

                       s = delta / (cMax + cMin);

                   }

                   else

                   {

                       s = delta / (2 - cMax - cMin);

                   }

                   if (r == cMax)

                   {

                       h = (g - b) / delta;

                   }

                   else if (g == cMax)

                   {

                       h = 2 + (b - r) / delta;

                   }

                   else

                   {

                       h = 4 + (r - g) / delta;

                   }

                   h /= 6;

                   if (h < 0)

                   {

                         h += 1;

                   }

               }

               h *= 360;

               result[1].SetPixel(i, j, HSL_to_RGB(h, 1, 0.5));

               result[2].SetPixel(i, j, HSL_to_RGB(0, s, 0.5));

               result[3].SetPixel(i, j, HSL_to_RGB(0, 0, l));

               result[0].SetPixel(i, j, HSL_to_RGB(h, s, l));

           }

       }

       return result;

   }

   Color HSL_to_RGB(double H, double S, double L)

   {

       double Q = L < 0.5? L * (1.0 + S): L + S - L * S;

       double P = 2.0 * L - Q;

       double Hk = H / 360;

       double[] T = new double[3];

       int[] C = new int[3];

       T[0] = Hk + (1.0 / 3.0);//Tr

       T[1] = Hk; //Tg

       T[2] = Hk - (1.0 / 3.0);//Tb

 

       for (int i = 0; i < 3; i++)

       {

           if (T[i] < 0) T[i] += 1.0;

           if (T[i] > 1) T[i] -= 1.0;

           if (T[i] < 1.0 / 6.0)

               T[i] = P + ((Q - P) * 6 * T[i]);

           else if (1.0 / 6.0 <= T[i] && T[i] < 1.0 / 2.0)

               T[i] = Q;

           else if (1.0 / 2.0 <= T[i] && T[i] < 2.0 / 3.0)

               T[i] = P + ((Q - P) * (2.0 / 3.0 - T[i]) * 6);

           else

               T[i] = P;

           C[i] = Math.Max(0, Math.Min(255, (int)(255 * T[i])));

       }

       return Color.FromArgb(C[0], C[1], C[2]);

   }

   private void RGBbutton_Click(object sender, EventArgs e)

   {

       SwitchButton.Visible = false;

       if (SourcePictureBox.Image == null)

       {

           MessageBox.Show("Сначала загрузите изображение");

           return;

       }

       if (NewImagePictureBox.Visible == true)

       {

           NewImagePictureBox.Visible = false;

           RPictureBox.Visible = true;

           GPictureBox.Visible = true;

           BPictureBox.Visible = true;

       }

       Bitmap[] rgb = GetRgbChannels((Bitmap)SourcePictureBox.Image);

       RPictureBox.Image = rgb[0];

       GPictureBox.Image = rgb[1];

       BPictureBox.Image = rgb[2];

       RPictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

       GPictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

       BPictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

   }

   private void SaveButton_Click(object sender, EventArgs e)

   {

       SwitchButton.Visible = false;

       if (SourcePictureBox.Image==null)

       {

           MessageBox.Show("Сначала загрузите изображение");

           return;

       }

       Bitmap bmp1 = (Bitmap)SourcePictureBox.Image;

       SaveFileDialog saveFile = new SaveFileDialog();

       saveFile.DefaultExt = "*.jpg";

       saveFile.Filter = "Изображения JPEG|*.jpg";

       saveFile.Title = "Сохранить как JPEG";

       saveFile.ShowDialog();

       if (saveFile.ShowDialog() == DialogResult.OK &&saveFile.FileName.Length > 0)

       {

           try

           {

               bmp1.Save(saveFile.FileName);

           }

           catch

           {

               MessageBox.Show("Невозможно сохранить файл", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);

           }

       }

   }

   private void Negativebutton_Click(object sender, EventArgs e)

   {

       SwitchButton.Visible = false;

       if (SourcePictureBox.Image == null)

       {

           MessageBox.Show("Сначала загрузите изображение");

           return;

       }

       if (NewImagePictureBox.Visible == false)

       {

           NewImagePictureBox.Visible = true;

           RPictureBox.Visible = false;

           GPictureBox.Visible = false;

           BPictureBox.Visible = false;

       }

       NewImagePictureBox.Image = Generate_negative_image((Bitmap)SourcePictureBox.Image);

       NewImagePictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

   }

   private void HSL_Click(object sender, EventArgs e)

   {

       SwitchButton.Visible = true;

       if (SourcePictureBox.Image == null)

       {

           MessageBox.Show("Сначала загрузите изображение");

           return;

       }

       if (NewImagePictureBox.Visible == true)

       {

           NewImagePictureBox.Visible = true;

           RPictureBox.Visible = false;

           GPictureBox.Visible = false;

           BPictureBox.Visible = false;

           SwitchButton.Visible = true;

       }

       Bitmap[] together = GetHLSChannels((Bitmap)SourcePictureBox.Image);

       RPictureBox.Image = together[1];

       GPictureBox.Image = together[2];

       BPictureBox.Image = together[3];

       NewImagePictureBox.Image = together[0];

       RPictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

       GPictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

       BPictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

       NewImagePictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

   }

   private void button1_Click(object sender, EventArgs e)

   {

       SwitchButton.Visible = false;

       Graphics g = SourcePictureBox.CreateGraphics();

       g.Clear(Color.White);

       Graphics a = NewImagePictureBox.CreateGraphics();

       a.Clear(Color.White);

       if (NewImagePictureBox.Visible == false)

       {

           NewImagePictureBox.Visible = true;

           RPictureBox.Visible = false;

           GPictureBox.Visible = false;

           BPictureBox.Visible = false;

       }

   }

   private void trackBar1_Scroll(object sender, EventArgs e)

   {

       noiseRlabel.Text = String.Format("Значение R: {0}", trackBar1.Value);

   }

   private void trackBar2_Scroll(object sender, EventArgs e)

   {

       noiseHlevel.Text = String.Format("Значение H: {0}", trackBar2.Value);

   }

   private void ShumRbutton_Click(object sender, EventArgs e)

   {

       SwitchButton.Visible = false;

       if (SourcePictureBox.Image == null)

       {

           MessageBox.Show("Сначала загрузите изображение");

           return;

       }

       if (NewImagePictureBox.Visible == false)

       {

           NewImagePictureBox.Visible = true;

           RPictureBox.Visible = false;

           GPictureBox.Visible = false;

           BPictureBox.Visible = false;

       }

       NewImagePictureBox.Image = NoiseR((Bitmap)SourcePictureBox.Image);

       NewImagePictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

       trackBar2.Value = 0;

       noiseHlevel.Text = String.Format("Значение H: {0}", trackBar2.Value);

   }

   private void ShumHbutton_Click(object sender, EventArgs e)

   {

       if (SourcePictureBox.Image == null)

       {

           MessageBox.Show("Сначала загрузите изображение");

           return;

       }

       SwitchButton.Visible = false;

        if (NewImagePictureBox.Visible == false)

       {

           NewImagePictureBox.Visible = true;

           RPictureBox.Visible = false;

           GPictureBox.Visible = false;

           BPictureBox.Visible = false;

       }

       NewImagePictureBox.Image = NoiseH((Bitmap)SourcePictureBox.Image);

       NewImagePictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

       trackBar1.Value = 0;

       noiseRlabel.Text = String.Format("Значение R: {0}", trackBar1.Value);

   }

   private void button1_Click_1(object sender, EventArgs e)

   {

       if (NewImagePictureBox.Visible == true)

       {

           NewImagePictureBox.Visible = false;

           RPictureBox.Visible = true;

           GPictureBox.Visible = true;

           BPictureBox.Visible = true;

           SwitchButton.Text = String.Format("Переключить на собранное избражение");

       }

       else

       {

           NewImagePictureBox.Visible = true;

           RPictureBox.Visible = false;

           GPictureBox.Visible = false;

           BPictureBox.Visible = false;

           SwitchButton.Text = String.Format("Переключить на базисы");

       }

   }

}

}


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

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

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

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

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.165 с.