Сравнительный анализ графических форматов файлов — КиберПедия 

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

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

2022-09-01 62
Сравнительный анализ графических форматов файлов 0.00 из 5.00 0 оценок
Заказать работу

ВВЕДЕНИЕ

Графический формат — это способ записи графической информации. Существует множество графических форматов, таких как: BMP, PCX, GIF, TGA, IMG, JPEG, IFF и др. И у каждого формата есть свои сильные и слабые стороны. Более сложные форматы, обеспечивая хорошую степень сжатия, требуют и больших вычислительных ресурсов для их чтения и вывода, но, в то же время они дают более качественное изображение, чем простые, при малой степени сжатия и более легком способе представлении данных. Форматы отличаются не только способом хранения информации на носителе, но и кодируемыми данными, что также формирует определённые трудности при перенесении информации из файлов одного формата в другой.

В данной курсовой работе мы поближе познакомимся с такими графическими форматами как BMP и JPEG, а также реализуем некоторые способы обработки изображения.


 

СРАВНИТЕЛЬНЫЙ АНАЛИЗ ГРАФИЧЕСКИХ ФОРМАТОВ ФАЙЛОВ

Формат BMP

Bitmap Picture – один из первых растровых форматов изображений, который используется до сегодняшнего дня. BMP – буквально является картой битов, а так как не использует никакого сжатия, то файлы такого формата получаются весьма большого размера.

Изображение в формате.bmp логически состоит из четырех частей:

¾ заголовок BITMAPFILEHEADER bmfh;

¾ заголовок BITMAPINFOHEADER;

¾ палитра (если нужна) RGBQUAD aColors[];

¾ изображение BYTE aBitmapBits[];.

Четвертая часть файла bmp - это массив пикселей изображения, записанных построчно. Пиксели в каждой строке записываются слева направо, а строки изображения сохраняются снизу вверх. Палитра в BMP-файлах хранится в виде списка структур RGBQUAD, где каждый элемент представляет отдельный цвет.

 Главное преимущество BMP – высокое качество изображения, изображение не теряет качества. Объем файла не зависит от степени заполнения изображения объектами, так как у изображений кодируется каждый пиксель. Поэтому его практически единственное применение - промежуточное хранение изображений во время работы. Также изображения в этом формате обычно плохо масштабируются.

Формат JPEG

JPEG (аббревиатура англ. Joint Photographic Experts Group – название американской организации, в которой был разработан данный формат) – графический формат, завоевавший большую популярность у пользователей Интернета, а также у поклонников фотографии. Все данные, которые записаны в файл, включая и заголовок представляются в виде отдельных записей или сегментов. Каждый сегмент имеет особый признак - маркер или ТЭГ (от английского tag - ярлык). В сегменте определяется также его длина и содержатся специфические для него данные. Новые сегменты для обеспечения "дальнейших расширений" могут добавляться очень легко. Понадобилось записать в файл что-нибудь новое - определи новый маркер и пиши на здоровье.

Именно так строятся файлы JPEG. Каждый из них содержит несколько сегментов заголовка и один или несколько сегментов данных изображений.

В JPEG используется цветовое пространство YCbCr. Цветовое пространство YCbCr и его вариации (иногда их обозначают YUV) является популярным методом эффективного представления цветных изображений. Полное описание цветного изображения задается величиной Y (компонентой светимости) и тремя хроматическими разностями Сb, Сr и Сg. которые выражают разность между интенсивностью соответствующего цвета и средней светимостью каждого пиксела изображения. Спецификация JPEG не обязывает вас использовать YCbCr. Но в большинстве файлов она используются, поскольку она даёт изображения лучшего качества после субдискретизации по сравнению с RGB.

У формата JPEG есть как достоинства, так и недостатки. JPEG хорошо подходит для сжатия изображений как с потерями, так и без них. Пользователь сам выбирает соотношение качество/размер файла. JPEG не занимает много пространства, он узнаваем всеми браузерами, графическими и текстовыми редакторами, совместим со всеми компьютерами, планшетами и мобильными телефонами. Но у этого формата есть и минусы, он плохо подходит для работы с текстом или с изображениями с четкими границами, он не поддерживает прозрачность, при сильном сжатии изображение «рассыпается» на пиксели, а также не рекомендуется его восстанавливать или пересохранять. Так как это также ухудшает качество.

Разработка UML-диаграмм

Диаграммы поведения UML визуализируют, определяют, конструируют и документируют динамические аспекты системы. Диаграммы поведения подразделяются на следующие категории: диаграммы вариантов использования, диаграммы взаимодействия, диаграммы состояний и диаграммы деятельности.

При создании диаграмм для обучающей системы использовался сервис Diagrams.net.

Диаграмма деятельности

Диаграмма деятельности ‒ это UML-диаграмма, которая описывает поведение системы на основе указания последовательности передаваемых сообщений. Она является аналогом блок-схем в UM.

Рисунок 2.4 – Диаграмма деятельности

2.2.2 Диаграмма вариантов использования

Диаграмма вариантов использования – UML-диаграмма, которая описывает действующие лица и прецеденты (варианты использования), а также спецификации, представляющего собой текстовое описание конкретных последовательностей действий (потока событий), которые выполняет пользователь при работе с системой.

Рисунок 2.5 – Диаграмма вариантов использования

Диаграмма компонентов

Диаграмма компонентов ‒ UML-диаграмма, которая показывает взаимосвязи между модулями (логическими или физическими), из которых состоит моделируемая система.

Рисунок 2.7 - Диаграмма компонентов

 


 

ОТКРЫТИЕ ФАЙЛА

Открытие BMP изображения осуществляется с помощью диалога OpenFileDialog ImageDialog. С помощью свойства Filter задано отображение только изображений BMP формата. После выбора изображения, пользователь нажимает кнопку «Открыть», на случай если файл не откроется, есть исключение, которое сообщит, что файл невозможно открыть. Если же файл откроется, то оно выведется в SourcePixtureBox.

Рисунок 3.1 – Алгоритм открытия BMP изображения

СОХРАНЕНИЕ ФАЙЛА

Сохранение JPEG изображения осуществляется с помощью диалога SaveFileDialog saveFile.  Расширением по умолчанию установлено JPEG. С помощью свойства Filter задано отображение только изображений JPEG формата. После выбора имени и расположения будущего файла, пользователь нажимает кнопку «Сохранить», на случай если файл не сохранится, есть исключение, которое сообщит, что файл невозможно сохранить.

Рисунок 4.1 – Алгоритм сохранения JPEG изображения

РЕАЛИЗАЦИЯ ЭФФЕКТОВ

Согласно варианту, в данной курсовой работе необходимо выполнить разложение изображения по базисам RGB, собрать по базисам HLS, зашумить составляющие R и H, сделать негатив изображения. Рассмотрим данные операции более детально.

Разложение по базисам RGB

RGB (Red, Green, Blue - красный, зеленый, синий) - аппаратно-ориентированная модель, используемая в дисплеях для аддитивного формирования оттенков самосветящихся объектов (пикселов экрана). Система координат RGB - куб с началом отсчета (0,0,0), соответствующим черному цвету. Максимальное значение RGB - (1,1,1) соответствует белому цвету.

Рисунок 5.1 – Цветовой куб

За разложение по цветовым базисам RGB в программе отвечает метод GetRgbChannels, который создает массив изображений, в которых обнуляет значение двух каналов, а третье значение берет из пикселя исходного изображения.

Рисунок 5.2 – Алгоритм разложения по базисам RGB

Собирание по базисам HLS

HLS (Hue, Lightness, Saturation - цветовой тон, светлота, насыщенность) -модель ориентированная на человека и обеспечивающая возможность явного задания требуемого оттенка цвета. Эта модель образует подпространство, представляющее собой двойной конус, в котором черный цвет задается вершиной нижнего конуса и соответствует значению L = 0, белый цвет максимальной интенсивности задается вершиной верхнего конуса и соответствует значению L = 1. Максимально интенсивные цветовые тона соответствуют основанию конусов с L = 0.5, что не совсем удобно. Цветовой тон H, аналогично системе HSV, задается углом поворота. Насыщенность S меняется в пределах от 0 до 1 и задается расстоянием от вертикальной оси L до боковой поверхности конуса. Т.е. максимально насыщенные цветовые цвета располагаются при L=0.5, S=1.

Рисунок 5.3 – Цветовое пространство HLS

За сложение по цветовым базисам HLS в программе отвечает метод GetHLSChannels, который берет значения R, G, B каждого пикселя, с помощью формул в H, L, S, затем, с помощью другим формул, обратно преобразует в R, G, B и записывает значения в пиксели нового изображения.

Рисунок 5.4 – Формулы перевода RGB в HLS

Рисунок 5.5 – Формулы перевода из HLS в RGB

Рисунок 5.6 – Алгоритм сложения по базисам HLS

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

Создание негатива является базовым эффектом. В основе этого метода лежит логическое отрицание значения каждого пиксела изображения.

За негатив изображения в программе отвечает метод Generate_negative_image, который берет значения R, G, B каждого пикселя исходного изображения, отнимает от 255 эти значения, это и будут значения R, G, B для изображения-негатива.

Рисунок 5.7 – Алгоритм получения негатива изображения

Зашумление составляющей R

За зашумление составляющей R в программе отвечает метод NoiseR, который заменяет значение R пикселей оригинального изображения на значение, указанное с помощью TrackBar.

Рисунок 5.8 – Алгоритм зашумления составляющей R

Зашумление составляющей H

За зашумление составляющей H в программе отвечает метод NoiseH, который берет значения L и S оригинального изображения, а значение H берет из TrackBar, после этого, с помощью математических формул, переводит H, L, S в R, G, B и записывает эти значения в пиксели нового изображения.

Рисунок 5.9 – Формулы перевода из HLS в RGB

Рисунок 5.10 – Алгоритм зашумления составляющей H

ВЫВОДЫ

В ходе выполнения курсовой работы были изучены особенности графических файлов BMP и JPEG форматов, разработан программный продукт для работы с BMP изображениями.

В разработанном приложении решены поставленные в техническом задании задачи, и реализованы требуемые возможности для работы с графическим форматом BMP.

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


 

ПЕРЕЧЕНЬ ССЫЛОК

1. OGmeta.ru Форматы изображений, применяемых в WEB / [Электронный ресурс] // Режим доступа: https://ogmeta.ru/image-types (Дата обращения: 22.11.2021).

2. Глоссарий Интернет-маркетинга Что такое JPEG? / [Электронный ресурс] // Режим доступа: https://www.glossary-internet.ru/terms/J/jpeg_joint_ photographic_experts_group/ (Дата обращения: 22.11.2021).

3. Александр Марголин Диаграммы UML для моделирования процессов и архитектуры проекта / А. К. Марголин / [Электронный ресурс] // Режим доступа: https://evergreens.com.ua/ru/articles/uml-diagrams.html (Дата обращения: 24.11.2021).

4. Новиков Ф. Иванов Д. Моделирование на UML / Ф.Н. Новиков, Д. И. Иванов. / [Электронный ресурс] // Режим доступа: http://book.uml3.ru (Дата обращения: 24.11.2021).

5. Максим Волков Физические принципы формирования цветовых оттенков / М. Т. Волков // Режим доступа: https://pandia.ru/text/78/562/85460.php (Дата обращения: 23.11.2021).

6. Cyberguru.ru Манипулирование цветами в.net – Часть первая / [Электронный ресурс] // Режим доступа: http://www.cyberguru.ru/algorithms/ algorithms-theory/algorithms-color-manipulation-in-net-part-i.html?showall=1 (Дата обращения: 22.11.2021).

7. Википедия HSL / [Электронный ресурс] // Режим доступа: https://ru.wikipedia.org/wiki/HSL (Дата обращения: 23.11.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("Переключить на базисы");

       }

   }

}

}

ВВЕДЕНИЕ

Графический формат — это способ записи графической информации. Существует множество графических форматов, таких как: BMP, PCX, GIF, TGA, IMG, JPEG, IFF и др. И у каждого формата есть свои сильные и слабые стороны. Более сложные форматы, обеспечивая хорошую степень сжатия, требуют и больших вычислительных ресурсов для их чтения и вывода, но, в то же время они дают более качественное изображение, чем простые, при малой степени сжатия и более легком способе представлении данных. Форматы отличаются не только способом хранения информации на носителе, но и кодируемыми данными, что также формирует определённые трудности при перенесении информации из файлов одного формата в другой.

В данной курсовой работе мы поближе познакомимся с такими графическими форматами как BMP и JPEG, а также реализуем некоторые способы обработки изображения.


 

СРАВНИТЕЛЬНЫЙ АНАЛИЗ ГРАФИЧЕСКИХ ФОРМАТОВ ФАЙЛОВ

Формат BMP

Bitmap Picture – один из первых растровых форматов изображений, который используется до сегодняшнего дня. BMP – буквально является картой битов, а так как не использует никакого сжатия, то файлы такого формата получаются весьма большого размера.

Изображение в формате.bmp логически состоит из четырех частей:

¾ заголовок BITMAPFILEHEADER bmfh;

¾ заголовок BITMAPINFOHEADER;

¾ палитра (если нужна) RGBQUAD aColors[];

¾ изображение BYTE aBitmapBits[];.

Четвертая часть файла bmp - это массив пикселей изображения, записанных построчно. Пиксели в каждой строке записываются слева направо, а строки изображения сохраняются снизу вверх. Палитра в BMP-файлах хранится в виде списка структур RGBQUAD, где каждый элемент представляет отдельный цвет.

 Главное преимущество BMP – высокое качество изображения, изображение не теряет качества. Объем файла не зависит от степени заполнения изображения объектами, так как у изображений кодируется каждый пиксель. Поэтому его практически единственное применение - промежуточное хранение изображений во время работы. Также изображения в этом формате обычно плохо масштабируются.

Формат JPEG

JPEG (аббревиатура англ. Joint Photographic Experts Group – название американской организации, в которой был разработан данный формат) – графический формат, завоевавший большую популярность у пользователей Интернета, а также у поклонников фотографии. Все данные, которые записаны в файл, включая и заголовок представляются в виде отдельных записей или сегментов. Каждый сегмент имеет особый признак - маркер или ТЭГ (от английского tag - ярлык). В сегменте определяется также его длина и содержатся специфические для него данные. Новые сегменты для обеспечения "дальнейших расширений" могут добавляться очень легко. Понадобилось записать в файл что-нибудь новое - определи новый маркер и пиши на здоровье.

Именно так строятся файлы JPEG. Каждый из них содержит несколько сегментов заголовка и один или несколько сегментов данных изображений.

В JPEG используется цветовое пространство YCbCr. Цветовое пространство YCbCr и его вариации (иногда их обозначают YUV) является популярным методом эффективного представления цветных изображений. Полное описание цветного изображения задается величиной Y (компонентой светимости) и тремя хроматическими разностями Сb, Сr и Сg. которые выражают разность между интенсивностью соответствующего цвета и средней светимостью каждого пиксела изображения. Спецификация JPEG не обязывает вас использовать YCbCr. Но в большинстве файлов она используются, поскольку она даёт изображения лучшего качества после субдискретизации по сравнению с RGB.

У формата JPEG есть как достоинства, так и недостатки. JPEG хорошо подходит для сжатия изображений как с потерями, так и без них. Пользователь сам выбирает соотношение качество/размер файла. JPEG не занимает много пространства, он узнаваем всеми браузерами, графическими и текстовыми редакторами, совместим со всеми компьютерами, планшетами и мобильными телефонами. Но у этого формата есть и минусы, он плохо подходит для работы с текстом или с изображениями с четкими границами, он не поддерживает прозрачность, при сильном сжатии изображение «рассыпается» на пиксели, а также не рекомендуется его восстанавливать или пересохранять. Так как это также ухудшает качество.


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

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

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

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

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...



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

0.405 с.