Работа с BMP-изображениями

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

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 19.12.2014
Размер файла 206,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное автономное образовательное учреждение высшего профессионального образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ ПРЕПОДАВАТЕЛЬ

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №1

по курсу: Основы мультимедиа технологий

СТУДЕНТ

А.С.Кузьмин

доц. к.т.н

Волошина Н.В

Санкт-Петербург - 2014

1. Постановка задачи

Написать программу для обработки изображения, выполняющую функции:

· Открытие изображения формата .bmp

· Сохранение обработанного изображения в формате .bmp

· Работа с цветовыми каналами RGB

· Вывод на экран гистограммы изображения

· Сохранение гистограммы

Формализация

Для выполнения поставленной задачи воспользуемся средой разработки MS Visual C#.

Создание интерфейса приложения.

Составляем список необходимых инструментов для работы приложения:

1. 2 поля для вывода изображения на экран;

2. 5 кнопок, выполняющих определенную процедуру;

3. 3 переключателя каналов RGB

Для использования элемента, необходимо выбрать его в Панели элементов, кликнуть по месту в форме нашего приложения на место его, где он нам необходим. Далее можно будет изменять положение этого элемента, его размеры, надписи и т.д.

Необходимые элементы в «Панель инструментов»:

- PictureBox

- Button

- CheckBox

Поле отображения изображения

В Панели элементов выбираем PictureBox. Создаем поле, располагаем его в форме нашего приложения там, где нам это необходимо, изменяем размер поля по своему усмотрению.

Режим изменения размера:

- Normal (По умолчанию)

- StretchImage

- AutoSize

- CenterImage

- Zoom

Этот режим отвечает за расположение и размер открытого изображения в поле. По умолчанию Normal не изменяет размера изображения и располагает его в верхнем левом углу поля. Если открытое изображение будет больше нашего поля, мы его будем видеть обрезанным. Для полного отображения изображения без искажений воспользуемся режимом Zoom.

Нам потребуется 2 поля: 1 - для вывода на экран исходного изображения(PictureBox1), 2 - для вывода обрабатываемого (PictureBox2). Поэтому копируем созданное поле и располагаем копию рядом с исходным.

Рис.1 Поля отображения рисунков

Кнопка 1. Открыть файл.

Для выбора изображения воспользуемся командой вызова специального диалогового окна

OpenFileDialog ofd = new OpenFileDialog(); . После выбора нужного нам изображения проделаем несколько операций для изменения размера окна под наше изображение. Это необходимо, чтобы при сохранении изображения не добавлялись пустые области поля.

Алгоритм вычисления новых размеров поля

1) У открытого изображения определить, какая сторона больше

2) Сторону поля параллельную большой стороне изображения помещаем в переменную для нового размера

3) Вычислить, во сколько раз сторона поля меньше стороны изображения

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

Изменяем размеры полей на новые значения

Затем на экран выводится открытое изображение в первом и втором поле.

Так как мы после обработки старого изображения можем открыть новое, галочки на фильтрах RGB необходимо перевести в положение false.

Кнопка 2. Сохранить файл.

Сохранение файла так же происходит вызовом специального диалогового окна.

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

Выбираем имя для файла и сохраняем под введенным именем.

Кнопка 3. Отмена.

Этой кнопкой мы переводим состояние всех флажнов канала RGB в состояние false и отменяем все нанесенные на изображение фильты путем копирования изображения из первого поля во второе.

Кнопка 4. Закрыть программу.

Закрытие программы происходит командой this.Close();

Кнопка 5. Гистограммы изображения.

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

Данные о яркости цвета мы отправляем в новое окно с гистограммами, которое открывается этой же кнопкой.

Переключатели фильтров RGB.

Каждый переключатель отвечает за свой цвет. Если мы переведем переключатель Red в состояние true, то удаляется красный цвет в каждом пикселе обрабатываемого изображения. Если мы переведем переключатель обратно в состояние false, то из пикселей исходного изображения копируем яркость цвета в обрабатываемое изображение.

Гистограммы.

Гистограмма (в фотографии) -- это график статистического распределения элементов цифрового изображения с различной яркостью, в котором по горизонтальной оси представлена яркость, а по вертикали -- относительное число пикселов с конкретным значением яркости.

В Visual C# гистограмма строится с помощью элемента Chart. Для удобного сравнения гистограмм исходного и обработанного изображения откроем их в отдельном окне с помощью кнопки Gist. Слева будут расположены гистограммы исходного изображения, справа - обработанного.
В поле инициализации окна мы ограничиваем ось У максимальным количеством пикселей 1 цвета из двух картинок и строим гистограммы для каждого цвета обоих изображений (Красного, Зеленого, Синего). Благодаря чему можем делать выводы, как изменяется яркость того или иного цвета при использовании какого-либо фильтра. Каждой гистограмме задаем размер, название, цвет столбцов, масштаб и данные о количестве пикселей с конкретной яркостью цвета.

Каждую гистограмму можно сохранить в формате .bmp с помощью кнопки Save расположенной рядом с желаемой гистограммой

В окне гистограмм так же присутствует кнопка Close, которая закрывает окно гистограмм.

Блок-схема

Размещено на http://www.allbest.ru/

2. Листинг программы

2.1 Окно обработки изображения

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;

using System.Drawing.Imaging;

namespace PicLab_1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

//OPEN FILE

private void button1_Click(object sender, EventArgs e)

{

OpenFileDialog ofd = new OpenFileDialog();

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

{

var img = Bitmap.FromFile(ofd.FileName);

//переменной width присваиваем ширину изображения

int width1 = img.Width, width2 = pictureBox1.Width, widthNew;

//переменной height присваиваем высоту изображения

int height1 = img.Height, height2 = pictureBox1.Height, heightNew;

double K;

if (width1 > height1)

{

widthNew = width2;

K = (double)width2 / (double)width1;

heightNew = (int)((double)(height1) * K);

}

else

{

heightNew = height2;

K = (double)height2 / (double)height1;

widthNew = (int)((double)(width1) * K);

}

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

var bmp = new Bitmap(img, widthNew, heightNew);

pictureBox1.Width = widthNew;

pictureBox1.Height = heightNew;

pictureBox2.Width = widthNew;

pictureBox2.Height = heightNew;

pictureBox1.Image = bmp;

pictureBox2.Image = bmp;

}

}

//SAVE FILE

private void button2_Click(object sender, EventArgs e)

{

using (SaveFileDialog sfd = new SaveFileDialog())

{

sfd.Title = "Сохранить";

sfd.Filter = "Bitmap Images (*.bmp)|*.bmp";

if (sfd.ShowDialog(this) == DialogResult.OK)

{

using (Bitmap bmp = new Bitmap(pictureBox2.Width, pictureBox2.Height))

{

pictureBox2.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));

pictureBox2.Image.Save("c://cc.bmp");

bmp.Save(sfd.FileName);

}

}

}

}

//Red

private void checkBox1_CheckedChanged(object sender, EventArgs e)

{

var bmp1 = new Bitmap(pictureBox1.Image, pictureBox1.Image.Width, pictureBox1.Image.Height);

var bmp2 = new Bitmap(pictureBox2.Image, pictureBox2.Image.Width, pictureBox2.Image.Height);

if (checkBox1.Checked == true)

for (int x = 0; x < bmp2.Width; x++)

{

for (int y = 0; y < bmp2.Height; y++)

{

bmp2.SetPixel(x, y, Color.FromArgb(0, bmp2.GetPixel(x, y).G, bmp2.GetPixel(x, y).B));

}

}

else

for (int x = 0; x < bmp2.Width; x++)

{

for (int y = 0; y < bmp2.Height; y++)

{

bmp2.SetPixel(x, y, Color.FromArgb(bmp1.GetPixel(x, y).R, bmp2.GetPixel(x, y).G, bmp2.GetPixel(x, y).B));

}

}

this.pictureBox2.Image = bmp2;

}

//Green

private void checkBox3_CheckedChanged(object sender, EventArgs e)

{

var bmp1 = new Bitmap(pictureBox1.Image, pictureBox1.Image.Width, pictureBox1.Image.Height);

var bmp2 = new Bitmap(pictureBox2.Image, pictureBox2.Image.Width, pictureBox2.Image.Height);

if (checkBox3.Checked == true)

for (int x = 0; x < bmp2.Width; x++)

{

for (int y = 0; y < bmp2.Height; y++)

{

bmp2.SetPixel(x, y, Color.FromArgb(bmp2.GetPixel(x, y).R, 0, bmp2.GetPixel(x, y).B));

}

}

else

for (int x = 0; x < bmp2.Width; x++)

{

for (int y = 0; y < bmp2.Height; y++)

{ интерфейс блок схема гистограмма

bmp2.SetPixel(x, y, Color.FromArgb(bmp2.GetPixel(x, y).R, bmp1.GetPixel(x, y).G, bmp2.GetPixel(x, y).B));

}

}

this.pictureBox2.Image = bmp2;

}

//Blue

private void checkBox2_CheckedChanged(object sender, EventArgs e)

{

var bmp1 = new Bitmap(pictureBox1.Image, pictureBox1.Image.Width, pictureBox1.Image.Height);

var bmp2 = new Bitmap(pictureBox2.Image, pictureBox2.Image.Width, pictureBox2.Image.Height);

if (checkBox2.Checked == true)

for (int x = 0; x < bmp2.Width; x++)

{

for (int y = 0; y < bmp2.Height; y++)

{

bmp2.SetPixel(x, y, Color.FromArgb(bmp2.GetPixel(x, y).R, bmp2.GetPixel(x, y).G, 0));

}

}

else

for (int x = 0; x < bmp2.Width; x++)

{

for (int y = 0; y < bmp2.Height; y++)

{

bmp2.SetPixel(x, y, Color.FromArgb(bmp2.GetPixel(x, y).R, bmp2.GetPixel(x, y).G, bmp1.GetPixel(x, y).B));

}

}

this.pictureBox2.Image = bmp2;

}

//Cancel

private void button5_Click(object sender, EventArgs e)

{

checkBox1.Checked = false;

checkBox2.Checked = false;

checkBox3.Checked = false;

pictureBox2.Image = pictureBox1.Image;

}

//Ghist

private void button3_Click(object sender, EventArgs e)

{

var bmp1 = pictureBox1.Image as Bitmap;

var bmp2 = pictureBox2.Image as Bitmap;

float[] Red1 = new float[256];

float[] Green1 = new float[256];

float[] Blue1 = new float[256];

float[] Red2 = new float[256];

float[] Green2 = new float[256];

float[] Blue2 = new float[256];

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

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

{

Red1[bmp1.GetPixel(i, j).R]++;

Green1[bmp1.GetPixel(i, j).G]++;

Blue1[bmp1.GetPixel(i, j).B]++;

Red2[bmp2.GetPixel(i, j).R]++;

Green2[bmp2.GetPixel(i, j).G]++;

Blue2[bmp2.GetPixel(i, j).B]++;

}

Form2 form2 = new Form2(Red1,Green1,Blue1,Red2,Green2,Blue2);

form2.ShowDialog();

}

//CLOSE

private void button4_Click(object sender, EventArgs e)

{

this.Close();

}

}

2.2 Окно с гистограммами изображения

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 PicLab_1

{

public partial class Form2 : Form

{

public Form2(float[] Red1, float[] Green1, float[] Blue1, float[] Red2, float[] Green2, float[] Blue2)

{

InitializeComponent();

String[] labels = new String[256];

float RedMax1 = 0, GreenMax1 = 0, BlueMax1 = 0;

float RedMax2 = 0, GreenMax2 = 0, BlueMax2 = 0;

float RedMax = 0, GreenMax = 0, BlueMax = 0;

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

{

if (Red1[i] > RedMax1)

RedMax1 = Red1[i];

if (Green1[i] > GreenMax1)

GreenMax1 = Green1[i];

if (Blue1[i] > BlueMax1)

BlueMax1 = Blue1[i];

if (Red2[i] > RedMax2)

RedMax2 = Red2[i];

if (Green2[i] > GreenMax2)

GreenMax2 = Green2[i];

if (Blue2[i] > BlueMax2)

BlueMax2 = Blue2[i];

if (RedMax2 > 6000)

RedMax = RedMax1;

else

{

if (RedMax2 > RedMax1)

RedMax = RedMax1;

else

RedMax = RedMax2;

}

if (GreenMax2 > 6000)

GreenMax = GreenMax1;

else

{

if (GreenMax2 > GreenMax1)

GreenMax = GreenMax1;

else

GreenMax = GreenMax2;

}

if (BlueMax2 > 6000)

BlueMax = BlueMax1;

else

{

if (BlueMax2 > BlueMax1)

BlueMax = BlueMax1;

else

BlueMax = BlueMax2;

}

}

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

{

labels[i] = " ";

}

labels[0] = "0"; labels[50] = "50"; labels[100] = "100"; labels[150] = "150"; labels[200] = "200"; labels[250] = "250"; labels[255] = "255";

chart1.Width = 500;

chart1.Height = 150;

chart1.Series[0].Points.Clear();

chart1.Series[0].LegendText = "Red1 ";

chart1.Series[0].Color = Color.FromArgb(255, 0, 0);

chart1.ChartAreas[0].AxisY.Maximum = (int)RedMax;

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

{

chart1.Series[0].Points.AddY(Red1[i]);

chart1.ChartAreas[0].AxisX.CustomLabels.Add(i - 1, i + 1, labels[i]);

}

chart2.Width = 500;

chart2.Height = 150;

chart2.Series[0].Points.Clear();

chart2.Series[0].LegendText = "Green1";

chart2.Series[0].Color = Color.FromArgb(0, 255, 0);

chart2.ChartAreas[0].AxisY.Maximum = (int)GreenMax;

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

{

chart2.Series[0].Points.AddY(Green1[i]);

chart2.ChartAreas[0].AxisX.CustomLabels.Add(i - 1, i + 1, labels[i]);

}

chart3.Width = 500;

chart3.Height = 150;

chart3.Series[0].Points.Clear();

chart3.Series[0].LegendText = "Blue1 ";

chart3.Series[0].Color = Color.FromArgb(0, 0, 255);

chart3.ChartAreas[0].AxisY.Maximum = (int)BlueMax;

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

{

chart3.Series[0].Points.AddY(Blue1[i]);

chart3.ChartAreas[0].AxisX.CustomLabels.Add(i - 1, i + 1, labels[i]);

}

chart4.Width = 500;

chart4.Height = 150;

chart4.Series[0].Points.Clear();

chart4.Series[0].LegendText = "Red2 ";

chart4.Series[0].Color = Color.FromArgb(255, 0, 0);

chart4.ChartAreas[0].AxisY.Maximum = (int)RedMax;

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

{

chart4.Series[0].Points.AddY(Red2[i]);

chart4.ChartAreas[0].AxisX.CustomLabels.Add(i - 1, i + 1, labels[i]);

}

chart5.Width = 500;

chart5.Height = 150;

chart5.Series[0].Points.Clear();

chart5.Series[0].LegendText = "Green2";

chart5.Series[0].Color = Color.FromArgb(0, 255, 0);

chart5.ChartAreas[0].AxisY.Maximum = (int)GreenMax;

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

{

chart5.Series[0].Points.AddY(Green2[i]);

chart5.ChartAreas[0].AxisX.CustomLabels.Add(i - 1, i + 1, labels[i]);

}

chart6.Width = 500;

chart6.Height = 150;

chart6.Series[0].Points.Clear();

chart6.Series[0].LegendText = "Blue2 ";

chart6.Series[0].Color = Color.FromArgb(0, 0, 255);

chart6.ChartAreas[0].AxisY.Maximum = (int)BlueMax;

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

{

chart6.Series[0].Points.AddY(Blue2[i]);

chart6.ChartAreas[0].AxisX.CustomLabels.Add(i - 1, i + 1, labels[i]);

}

}

private void button1_Click(object sender, EventArgs e)

{

this.Close();

}

private void button3_Click(object sender, EventArgs e)

{

SaveFileDialog savedialog = new SaveFileDialog();

savedialog.Title = "Сохранить картинку";

savedialog.Filter = "Bitmap File(*.bmp)|*.bmp";

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

{

this.chart4.SaveImage(savedialog.FileName, System.Drawing.Imaging.ImageFormat.Bmp);

}

}

private void button5_Click(object sender, EventArgs e)

{

SaveFileDialog savedialog = new SaveFileDialog();

savedialog.Title = "Сохранить картинку";

savedialog.Filter = "Bitmap File(*.bmp)|*.bmp";

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

{

this.chart5.SaveImage(savedialog.FileName, System.Drawing.Imaging.ImageFormat.Bmp);

}

}

private void button7_Click(object sender, EventArgs e)

{

SaveFileDialog savedialog = new SaveFileDialog();

savedialog.Title = "Сохранить картинку";

savedialog.Filter = "Bitmap File(*.bmp)|*.bmp";

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

{

this.chart6.SaveImage(savedialog.FileName, System.Drawing.Imaging.ImageFormat.Bmp);

}

}

private void button2_Click(object sender, EventArgs e)

{

SaveFileDialog savedialog = new SaveFileDialog();

savedialog.Title = "Сохранить картинку";

savedialog.Filter = "Bitmap File(*.bmp)|*.bmp";

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

{

this.chart1.SaveImage(savedialog.FileName, System.Drawing.Imaging.ImageFormat.Bmp);

}

}

private void button4_Click(object sender, EventArgs e)

{

SaveFileDialog savedialog = new SaveFileDialog();

savedialog.Title = "Сохранить картинку";

savedialog.Filter = "Bitmap File(*.bmp)|*.bmp";

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

{

this.chart2.SaveImage(savedialog.FileName, System.Drawing.Imaging.ImageFormat.Bmp);

}

}

private void button6_Click(object sender, EventArgs e)

{

SaveFileDialog savedialog = new SaveFileDialog();

savedialog.Title = "Сохранить картинку";

savedialog.Filter = "Bitmap File(*.bmp)|*.bmp";

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

{

this.chart3.SaveImage(savedialog.FileName, System.Drawing.Imaging.ImageFormat.Bmp);

}

}

}

}

3. Результаты работы программы

Вывод

В ходе выполнения лабораторной работы была разработана программа в среде Visual Studio C#, выполняющая функции:

· Открытие изображения формата .bmp

· Сохранение обработанного изображения в формате .bmp

· Работа с цветовыми каналами RGB

· Вывод на экран гистограммы изображения

· Сохранение гистограммы

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

Размещено на Allbest.ru


Подобные документы

  • Составление блок-схемы алгоритма решения задачи, погрешности вычисления суммы членов числового ряда. Разработка программ на языке на Visual Basic, работа с массивами. Особенности работы со строковыми данными. Варианты реализации формы приложения.

    контрольная работа [220,4 K], добавлен 18.06.2010

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

    курсовая работа [588,7 K], добавлен 17.07.2012

  • Элементы и переменные, используемые для составления записи в Паскале. Основные числовые типы языка Turbo Pascal. Составление блок-схемы приложения, программирование по ней программы для вычисления функции. Последовательность выполнения алгоритма.

    лабораторная работа [256,9 K], добавлен 10.11.2015

  • Исследование теоретических аспектов разработки программы посредством использования Visual Basic. Анализ достоинств и недостатков данного языка программирования. Изучение особенностей создания интерфейса приложения. Основные этапы реализации программы.

    практическая работа [460,6 K], добавлен 22.01.2013

  • Проведение исследования опыта взаимодействия в сети. Методы улучшения согласования с пользователем web-сервиса. Особенность проектирования онлайн-приложения. Изучение разработки контроллеров и моделей. Характеристика создания интерфейса программы.

    дипломная работа [1,3 M], добавлен 11.08.2017

  • Особенность разработки алгоритмов для базы данных "Поэты". Анализ реализации анимации с помощью многофункциональной кроссплатформенной библиотеки SFML. Характеристика схемы алгоритма работы меню. Осуществление запуска программы через VisualStudio.

    курсовая работа [4,4 M], добавлен 10.05.2019

  • Рассмотрение методов прямоугольников и трапеций как способов вычисления определенных интегралов. Характеристика графика зависимости погрешности от числа разбиений N. Создание приложения по вычислению интеграла с помощью методов приближенного вычисления.

    курсовая работа [1,6 M], добавлен 20.06.2012

  • Разработка алгоритма решения задачи численного интегрирования методом трапеции. Словесное описание и блок-схема разработанного алгоритма программы. Описание интерфейса, главного окна и основных форм программы. Проверка работоспособности программы.

    курсовая работа [1,4 M], добавлен 16.03.2012

  • Общая характеристика интерфейса языка программирования Delphi. Рассмотрение окна редактора кода, конструктора формы, инспектора объектов и расширения файлов. Ознакомление с основными этапами создания и сохранения простого приложения; проверка его работы.

    презентация [184,3 K], добавлен 18.03.2014

  • Теоретические основы разработки Windows-приложений с использованием библиотеки MFC. Создание приложения с помощью Visual C++. Описание логической структуры приложения. Установка и запуск программы. Входные и выходные данные. Преимущество MFC библиотек.

    курсовая работа [563,2 K], добавлен 21.06.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.