Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Топ:
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Оснащения врачебно-сестринской бригады.
Определение места расположения распределительного центра: Фирма реализует продукцию на рынках сбыта и имеет постоянных поставщиков в разных регионах. Увеличение объема продаж...
Интересное:
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Уполаживание и террасирование склонов: Если глубина оврага более 5 м необходимо устройство берм. Варианты использования оврагов для градостроительных целей...
Дисциплины:
2022-09-01 | 47 |
5.00
из
|
Заказать работу |
|
|
ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНІВЕРСИТЕТ
Факультет информационных систем и технологий
Кафедра компьютерного моделирования и дизайна
Специальность Информационные системы и технологии
УТВЕРЖДАНО:
зав. кафедрой КМД
Карабчевский В.В.
“___” _____________ 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!