Курсач по инфе РАЗРАБОТКА РЕДАКТОРА ИЗОБРАЖЕНИЙ. Курсовая. Курсовой проект по дисциплине Информационные технологии
Скачать 1.79 Mb.
|
|
Студент гр. 0105 | | Крылов Г.В. |
Преподаватель | | Чиркунова А.А. |
Санкт-Петербург
2021
ЗАДАНИЕ
НА КУРСОВОЙ ПРОЕКТ
Студент Крылов Г.В.
Группа 0105
Тема проекта: РАЗРАБОТКА РЕДАКТОРА ИЗОБРАЖЕНИЙ
Исходные данные:
Изображение формата .bmp; фильтры (Выделение каналов R, G, B, оранжевый, прямоугольный ластик, уменьшение масштаба по горизонтали, соляризация, линейная растяжка гистограммы); Содержание пояснительной записки:
Содержание, Введение, 1. Теоретическая часть,2. Программные документы, Заключение, Список использованных источников
Предполагаемый объем пояснительной записки:
Не менее 15 страниц.
Дата выдачи задания: 05.04.2021 | |
Дата сдачи реферата: | |
Дата защиты реферата: | |
Студент | Крылов Г.В. |
Преподаватель | Чиркунова А.А. |
АННОТАЦИЯ
Данный проект представляет из себя разработку простейщего графического редектора, который проводит обработку изображения с помощью фильтров. Проект выполнен в среде програмирования Visual Studio 2019 на языке С++.
содержание
| Введение………………………………………………………… | 6 |
1. | Теоретическая часть……………………………………………. 1.1. Фильтр Выделение каналов R, G, B, оранжевый 1.2. Фильтр Соляризация 1.3. Фильтр Прямоугольный ластик 1.4. Фильтр Линейная Растяжка Гистограммы 1.5. Фильтр Уменьшение масштаба по горизонтали | 7 |
2. | Программные документы……………………………………… | 9 |
2.1. | Спецификация…………………………………………………... | 9 |
2.2. | Описание программы…………………………………………... | 9 |
2.2.1. | Общие сведения………………………………………………… | 9 |
2.2.2. | Функциональное назначение…………………………………... | 9 |
2.2.3. | Описание логической структуры……………………………… | 9 |
2.2.4. | Используемые технические средства………………………… | 9 |
2.2.5. | Вызов и загрузка………………………………………………... | 9 |
2.2.6. | Выходные данные ……………………………………………... | 9 |
2.3. | Текст программы……………………………………………… | 9 |
2.4. | Эксплуатационные документы………………………………... | 30 |
2.4.1. | Ведомость эксплуатационных документов…………………... | 30 |
2.4.2. | Описание применения………………………………………….. | 30 |
2.4.2.1. | Назначение программы………………………………………… | 30 |
2.4.2.2. | Условия применения…………………………………………… | 30 |
2.4.2.3. | Описание задачи………………………………………………... | 30 |
2.4.2.4 | Входные и выходные данные………………………………….. | 30 |
2.4.3. | Руководство оператора……………………………………….. | 30 |
2.4.3.1. | Назначение программы………………………………………… | 30 |
2.4.3.2. | Условия выполнения программы……………………………... | 31 |
2.4.3.3. | Выполнение программы……………………………………….. | 31 |
2.4.3.4. | Выполнение программы……………………………………….. | 32 |
| Заключение……………………………………………………... | 33 |
| Список использованных источников…………………………. | 35 |
ВВЕДЕНИЕ
Цель: разработка программного обеспечения для редактирования изображений,
отладка программного обеспечения.
Задачи:
Реализация графического интерфейса.
Реализация фильтров выделение каналов R, G, B, оранжевый, соляризация, фильтр линейная растяжка гистограммы, прямоугольный ластик, уменьшение изображения по горизонтали.
Тестирование программ
тЕОРЕТИЧЕСКАЯ ЧАСТЬ
1.1 Выделение каналов R, G, B Фильтр 1.8 оранжевый
Выделение каналов R, G, B.
1.2 Фильтр2.5 СОЛЯРИЗАЦИЯ
Преобразование осуществляется согласно рис. 11.
Рис. 11
Пользователь задает уровни q1иq*max.
В случае обработки цветного изображения фильтр применяется к каждому каналу отдельно.
1.3. Ластик заданного размера. Реализовать визуальный эффект «стирания» изображения в области нажатия «ластика».
Прямоугольный ластик, размер задается пользователем (в количестве пикселов).
1.4. Фильтр Линейная Растяжка Гистограммы
Гистограмма – это графическое отображение распределения полутонов. По горизонтали идет шкала яркости, а по вертикали – количество пикселей с данной яркостью (рис. 15).
Гистограмма читается слева на право, от черного к белому. Анализ гистограммы и модификация гистограммы изображения – важный инструмент в компьютерном зрении и видеоаналитике.
Рис. 15
2.5.2 Фильтр 4.2 Линейная растяжка гистограммы.
Уровням исходного изображения, лежащим в интервале [fмин, fмакс], присваивают новые значения с тем, чтобы охватить весь возможный интервал изменения яркости [0, 255]. При этом существенно увеличивается контраст. Преобразование уровней яркости осуществляется по формуле:
где fi- старое значение яркости i-го пиксела, gi - новое значение, a, b – коэффициенты, выбираемые так, что gмин = 0, gмакс = 255.
1.5. Фильтр Уменьшение масштаба по горизонтали
Уменьшение масштаба изображения (рис.17)
Рис. 17
2. ПРОГРАММНЫЕ ДОКУМЕНТЫ
2.1. Описание программы
2.1.1. Общие сведения
Проект реализован в программной среде Visual Studio 2019 на языке С++.
2.1.2. Функциональное назначение
Простейший графический редактор, для работы с изображениями формата .jpg.
2.1.3. Используемые технические средства
Персональный компьютор
2.1.4. Вызов и загрузка
Вызов и загрузка осуществляется через программу Visual Studio 2019 и проект занимает 33 МБ памяти на диске.
2.1.5. Входные данные
Изображение в формате .jpg
2.1.6. Выходные данные
Изображение, к которому применена фильтрация, в формате .jpg
2.2. Текст программы
#pragma once
namespace My08KrylovGV {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Collections::Generic;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
///
/// Summary for MainForm
///
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyForm(void)
{
InitializeComponent();
}
protected:
MyForm()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::MenuStrip^ menuStrip;
private: System::Windows::Forms::ToolStripMenuItem^ файлToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ открытьToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ сохранитьToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ восстановитьToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ выходToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ инструментыToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ channelselectionorange;
private: System::Windows::Forms::ToolStripMenuItem^ соляризацияTSMI;
private: System::Windows::Forms::ToolStripMenuItem^ ЛастикToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ linearhistogramstretchingTSMI;
private: System::Windows::Forms::ToolStripMenuItem^ gorizontalZoomOutTSMI;
private: System::Windows::Forms::ToolStripMenuItem^ видToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ увеличитьМасштабToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ уменьшитьМасштабToolStripMenuItem;
private: System::Windows::Forms::ToolStripMenuItem^ справкаToolStripMenuItem;
private: System::Windows::Forms::TableLayoutPanel^ mainTableLayoutPanel;
private: System::Windows::Forms::CheckBox^ halfFilterCheckBox;
private: System::Windows::Forms::TableLayoutPanel^ imageInfoTableLayoutPanel;
private: System::Windows::Forms::Label^ imageSizeLabel;
private: System::Windows::Forms::Label^ pixelInfoLabel;
private: System::Windows::Forms::Panel^ filterPanel;
private: System::Windows::Forms::Panel^ imagePanel;
private: System::Windows::Forms::PictureBox^ pictureBox;
private: System::Windows::Forms::OpenFileDialog^ openFileDialog;
private: System::Windows::Forms::SaveFileDialog^ saveFileDialog;
private: System::Windows::Forms::ComboBox^ zoomComboBox;
private:
System::ComponentModel::Container^ components;
// Изображение с которым мы сейчас работаем
Bitmap^ present;
// Отмаштабируемое отображаемое изображение
Bitmap^ enlarged;
Bitmap^ normal;
Bitmap^ temporary;
String^ filename;
private: System::Windows::Forms::Panel^ соляризацияPanel;
private: System::Windows::Forms::Label^ соляризацияParamLabel;
private: System::Windows::Forms::NumericUpDown^ соляризация_q1Value;
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::Panel^ histPanel;
private: System::Windows::Forms::Label^ label2;
private: System::Windows::Forms::Label^ label3;
private: System::Windows::Forms::NumericUpDown^ соляризация_qmaxValue;
private: System::Windows::Forms::Label^ label4;
private: System::Windows::Forms::Button^ button1;
private: System::Windows::Forms::Button^ linearhistogramstretchingButton;
int Zoom = 100;
private: System::Windows::Forms::Panel^ Ластикpanel;
private: System::Windows::Forms::Button^ ЛастикButton;
private: System::Windows::Forms::Label^ label5;
private: System::Windows::Forms::NumericUpDown^ histValue2;
private: System::Windows::Forms::NumericUpDown^ histValue1;
private: System::Windows::Forms::Label^ label6;
private: System::Windows::Forms::NumericUpDown^ histValue4;
bool eraser = false;
#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
this->menuStrip = (gcnew System::Windows::Forms::MenuStrip());
this->файлToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->открытьToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->сохранитьToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->восстановитьToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->выходToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->инструментыToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->channelselectionorange = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->соляризацияTSMI = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->ЛастикToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->linearhistogramstretchingTSMI = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->gorizontalZoomOutTSMI = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->видToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->увеличитьМасштабToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->уменьшитьМасштабToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->справкаToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
this->mainTableLayoutPanel = (gcnew System::Windows::Forms::TableLayoutPanel());
this->halfFilterCheckBox = (gcnew System::Windows::Forms::CheckBox());
this->imageInfoTableLayoutPanel = (gcnew System::Windows::Forms::TableLayoutPanel());
this->pixelInfoLabel = (gcnew System::Windows::Forms::Label());
this->imageSizeLabel = (gcnew System::Windows::Forms::Label());
this->zoomComboBox = (gcnew System::Windows::Forms::ComboBox());
this->filterPanel = (gcnew System::Windows::Forms::Panel());
this->histPanel = (gcnew System::Windows::Forms::Panel());
this->label6 = (gcnew System::Windows::Forms::Label());
this->histValue1 = (gcnew System::Windows::Forms::NumericUpDown());
this->histValue2 = (gcnew System::Windows::Forms::NumericUpDown());
this->linearhistogramstretchingButton = (gcnew System::Windows::Forms::Button());
this->label2 = (gcnew System::Windows::Forms::Label());
this->label3 = (gcnew System::Windows::Forms::Label());
this->Ластикpanel = (gcnew System::Windows::Forms::Panel());
this->histValue4 = (gcnew System::Windows::Forms::NumericUpDown());
this->ЛастикButton = (gcnew System::Windows::Forms::Button());
this->label5 = (gcnew System::Windows::Forms::Label());
this->соляризацияPanel = (gcnew System::Windows::Forms::Panel());
this->button1 = (gcnew System::Windows::Forms::Button());
this->соляризация_qmaxValue = (gcnew System::Windows::Forms::NumericUpDown());
this->label4 = (gcnew System::Windows::Forms::Label());
this->label1 = (gcnew System::Windows::Forms::Label());
this->соляризация_q1Value = (gcnew System::Windows::Forms::NumericUpDown());
this->соляризацияParamLabel = (gcnew System::Windows::Forms::Label());
this->imagePanel = (gcnew System::Windows::Forms::Panel());
this->pictureBox = (gcnew System::Windows::Forms::PictureBox());
this->openFileDialog = (gcnew System::Windows::Forms::OpenFileDialog());
this->saveFileDialog = (gcnew System::Windows::Forms::SaveFileDialog());
this->menuStrip->SuspendLayout();
this->mainTableLayoutPanel->SuspendLayout();
this->imageInfoTableLayoutPanel->SuspendLayout();
this->filterPanel->SuspendLayout();
this->histPanel->SuspendLayout();
(cli::safe_cast
(cli::safe_cast
this->Ластикpanel->SuspendLayout();
(cli::safe_cast
this->соляризацияPanel->SuspendLayout();
(cli::safe_cast
(cli::safe_cast
this->imagePanel->SuspendLayout();
(cli::safe_cast
this->SuspendLayout();
//
// menuStrip
//
this->menuStrip->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(4) {
this->файлToolStripMenuItem,
this->инструментыToolStripMenuItem, this->видToolStripMenuItem, this->справкаToolStripMenuItem
});
this->menuStrip->Location = System::Drawing::Point(0, 0);
this->menuStrip->Name = L"menuStrip";
this->menuStrip->Size = System::Drawing::Size(1121, 24);
this->menuStrip->TabIndex = 0;
this->menuStrip->Text = L"menuStrip";
//
// файлToolStripMenuItem
//
this->файлToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(4) {
this->открытьToolStripMenuItem,
this->сохранитьToolStripMenuItem, this->восстановитьToolStripMenuItem, this->выходToolStripMenuItem
});
this->файлToolStripMenuItem->Name = L"файлToolStripMenuItem";
this->файлToolStripMenuItem->Size = System::Drawing::Size(48, 20);
this->файлToolStripMenuItem->Text = L"Файл";
//
// открытьToolStripMenuItem
//
this->открытьToolStripMenuItem->Name = L"открытьToolStripMenuItem";
this->открытьToolStripMenuItem->Size = System::Drawing::Size(149, 22);
this->открытьToolStripMenuItem->Text = L"Открыть";
this->открытьToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::открытьToolStripMenuItem_Click);
//
// сохранитьToolStripMenuItem
//
this->сохранитьToolStripMenuItem->Enabled = false;
this->сохранитьToolStripMenuItem->Name = L"сохранитьToolStripMenuItem";
this->сохранитьToolStripMenuItem->Size = System::Drawing::Size(149, 22);
this->сохранитьToolStripMenuItem->Text = L"Сохранить";
this->сохранитьToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::сохранитьToolStripMenuItem_Click);
//
// восстановитьToolStripMenuItem
//
this->восстановитьToolStripMenuItem->Enabled = false;
this->восстановитьToolStripMenuItem->Name = L"восстановитьToolStripMenuItem";
this->восстановитьToolStripMenuItem->Size = System::Drawing::Size(149, 22);
this->восстановитьToolStripMenuItem->Text = L"Восстановить";
this->восстановитьToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::восстановитьToolStripMenuItem_Click);
//
// выходToolStripMenuItem
//
this->выходToolStripMenuItem->Name = L"выходToolStripMenuItem";
this->выходToolStripMenuItem->Size = System::Drawing::Size(149, 22);
this->выходToolStripMenuItem->Text = L"Выход";
this->выходToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::выходToolStripMenuItem_Click);
//
// инструментыToolStripMenuItem
//
this->инструментыToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(5) {
this->channelselectionorange,
this->соляризацияTSMI, this->ЛастикToolStripMenuItem, this->linearhistogramstretchingTSMI, this->gorizontalZoomOutTSMI
});
this->инструментыToolStripMenuItem->Name = L"инструментыToolStripMenuItem";
this->инструментыToolStripMenuItem->Size = System::Drawing::Size(95, 20);
this->инструментыToolStripMenuItem->Text = L"Инструменты";
//
// channelselectionorange
//
this->channelselectionorange->Enabled = false;
this->channelselectionorange->Name = L"channelselectionorange";
this->channelselectionorange->Size = System::Drawing::Size(289, 22);
this->channelselectionorange->Text = L"Выделение_каналов_R,G,B_Оранжевый";
this->channelselectionorange->Click += gcnew System::EventHandler(this, &MyForm::channelselectionorange_Click);
//
// соляризацияTSMI
//
this->соляризацияTSMI->Enabled = false;
this->соляризацияTSMI->Name = L"соляризацияTSMI";
this->соляризацияTSMI->Size = System::Drawing::Size(289, 22);
this->соляризацияTSMI->Text = L"Соляризация";
this->соляризацияTSMI->Click += gcnew System::EventHandler(this, &MyForm::соляризацияTSMI_Click);
//
// ЛастикToolStripMenuItem
//
this->ЛастикToolStripMenuItem->Enabled = false;
this->ЛастикToolStripMenuItem->Name = L"ЛастикToolStripMenuItem";
this->ЛастикToolStripMenuItem->Size = System::Drawing::Size(289, 22);
this->ЛастикToolStripMenuItem->Text = L"Ластик";
this->ЛастикToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::ЛастикToolStripMenuItem_Click);
//
// linearhistogramstretchingTSMI
//
this->linearhistogramstretchingTSMI->Enabled = false;
this->linearhistogramstretchingTSMI->Name = L"linearhistogramstretchingTSMI";
this->linearhistogramstretchingTSMI->Size = System::Drawing::Size(289, 22);
this->linearhistogramstretchingTSMI->Text = L"Нормализация гистограммы";
this->linearhistogramstretchingTSMI->Click += gcnew System::EventHandler(this, &MyForm::linearhistogramstretchingTSMI_Click);
//
// gorizontalZoomOutTSMI
//
this->gorizontalZoomOutTSMI->Enabled = false;
this->gorizontalZoomOutTSMI->Name = L"gorizontalZoomOutTSMI";
this->gorizontalZoomOutTSMI->Size = System::Drawing::Size(289, 22);
this->gorizontalZoomOutTSMI->Text = L"Уменьшение масштаба по вертикали";
this->gorizontalZoomOutTSMI->Click += gcnew System::EventHandler(this, &MyForm::gorizontalZoomOutTSMI_Click);
//
// видToolStripMenuItem
//
this->видToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(2) {
this->увеличитьМасштабToolStripMenuItem,
this->уменьшитьМасштабToolStripMenuItem
});
this->видToolStripMenuItem->Name = L"видToolStripMenuItem";
this->видToolStripMenuItem->Size = System::Drawing::Size(39, 20);
this->видToolStripMenuItem->Text = L"Вид";
//
// увеличитьМасштабToolStripMenuItem
//
this->увеличитьМасштабToolStripMenuItem->Enabled = false;
this->увеличитьМасштабToolStripMenuItem->Name = L"увеличитьМасштабToolStripMenuItem";
this->увеличитьМасштабToolStripMenuItem->Size = System::Drawing::Size(191, 22);
this->увеличитьМасштабToolStripMenuItem->Text = L"Увеличить масштаб";
this->увеличитьМасштабToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::увеличитьМасштабToolStripMenuItem_Click);
//
// уменьшитьМасштабToolStripMenuItem
//
this->уменьшитьМасштабToolStripMenuItem->Enabled = false;
this->уменьшитьМасштабToolStripMenuItem->Name = L"уменьшитьМасштабToolStripMenuItem";
this->уменьшитьМасштабToolStripMenuItem->Size = System::Drawing::Size(191, 22);
this->уменьшитьМасштабToolStripMenuItem->Text = L"Уменьшить масштаб";
this->уменьшитьМасштабToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::уменьшитьМасштабToolStripMenuItem_Click);
//
// справкаToolStripMenuItem
//
this->справкаToolStripMenuItem->Name = L"справкаToolStripMenuItem";
this->справкаToolStripMenuItem->Size = System::Drawing::Size(65, 20);
this->справкаToolStripMenuItem->Text = L"Справка";
this->справкаToolStripMenuItem->Click += gcnew System::EventHandler(this, &MyForm::справкаToolStripMenuItem_Click);
//
// mainTableLayoutPanel
//
this->mainTableLayoutPanel->BackColor = System::Drawing::SystemColors::Control;
this->mainTableLayoutPanel->CellBorderStyle = System::Windows::Forms::TableLayoutPanelCellBorderStyle::Inset;
this->mainTableLayoutPanel->ColumnCount = 2;
this->mainTableLayoutPanel->ColumnStyles->Add((gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Percent,
100)));
this->mainTableLayoutPanel->ColumnStyles->Add((gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Absolute,
330)));
this->mainTableLayoutPanel->Controls->Add(this->halfFilterCheckBox, 1, 1);
this->mainTableLayoutPanel->Controls->Add(this->imageInfoTableLayoutPanel, 0, 1);
this->mainTableLayoutPanel->Controls->Add(this->filterPanel, 1, 0);
this->mainTableLayoutPanel->Controls->Add(this->imagePanel, 0, 0);
this->mainTableLayoutPanel->Dock = System::Windows::Forms::DockStyle::Fill;
this->mainTableLayoutPanel->Location = System::Drawing::Point(0, 24);
this->mainTableLayoutPanel->Name = L"mainTableLayoutPanel";
this->mainTableLayoutPanel->RowCount = 2;
this->mainTableLayoutPanel->RowStyles->Add((gcnew System::Windows::Forms::RowStyle(System::Windows::Forms::SizeType::Percent,
100)));
this->mainTableLayoutPanel->RowStyles->Add((gcnew System::Windows::Forms::RowStyle(System::Windows::Forms::SizeType::Absolute,
50)));
this->mainTableLayoutPanel->Size = System::Drawing::Size(1121, 537);
this->mainTableLayoutPanel->TabIndex = 1;
//
// halfFilterCheckBox
//
this->halfFilterCheckBox->Anchor = System::Windows::Forms::AnchorStyles::None;
this->halfFilterCheckBox->AutoSize = true;
this->halfFilterCheckBox->BackColor = System::Drawing::SystemColors::Control;
this->halfFilterCheckBox->Location = System::Drawing::Point(847, 501);
this->halfFilterCheckBox->Name = L"halfFilterCheckBox";
this->halfFilterCheckBox->Size = System::Drawing::Size(214, 17);
this->halfFilterCheckBox->TabIndex = 0;
this->halfFilterCheckBox->Text = L"Применить к половине изображения";
this->halfFilterCheckBox->UseVisualStyleBackColor = false;
//
// imageInfoTableLayoutPanel
//
this->imageInfoTableLayoutPanel->CellBorderStyle = System::Windows::Forms::TableLayoutPanelCellBorderStyle::OutsetPartial;
this->imageInfoTableLayoutPanel->ColumnCount = 3;
this->imageInfoTableLayoutPanel->ColumnStyles->Add((gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Percent,
23.72881F)));
this->imageInfoTableLayoutPanel->ColumnStyles->Add((gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Percent,
7.263923F)));
this->imageInfoTableLayoutPanel->ColumnStyles->Add((gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Percent,
70)));
this->imageInfoTableLayoutPanel->Controls->Add(this->pixelInfoLabel, 2, 0);
this->imageInfoTableLayoutPanel->Controls->Add(this->imageSizeLabel, 0, 0);
this->imageInfoTableLayoutPanel->Controls->Add(this->zoomComboBox, 1, 0);
this->imageInfoTableLayoutPanel->Dock = System::Windows::Forms::DockStyle::Fill;
this->imageInfoTableLayoutPanel->Location = System::Drawing::Point(5, 488);
this->imageInfoTableLayoutPanel->Name = L"imageInfoTableLayoutPanel";
this->imageInfoTableLayoutPanel->RowCount = 1;
this->imageInfoTableLayoutPanel->RowStyles->Add((gcnew System::Windows::Forms::RowStyle(System::Windows::Forms::SizeType::Percent,
100)));
this->imageInfoTableLayoutPanel->Size = System::Drawing::Size(779, 44);
this->imageInfoTableLayoutPanel->TabIndex = 1;
//
// pixelInfoLabel
//
this->pixelInfoLabel->Anchor = System::Windows::Forms::AnchorStyles::None;
this->pixelInfoLabel->AutoSize = true;
this->pixelInfoLabel->Location = System::Drawing::Point(510, 15);
this->pixelInfoLabel->Name = L"pixelInfoLabel";
this->pixelInfoLabel->Size = System::Drawing::Size(0, 13);
this->pixelInfoLabel->TabIndex = 1;
//
// imageSizeLabel
//
this->imageSizeLabel->Anchor = System::Windows::Forms::AnchorStyles::None;
this->imageSizeLabel->AutoSize = true;
this->imageSizeLabel->Location = System::Drawing::Point(93, 15);
this->imageSizeLabel->Name = L"imageSizeLabel";
this->imageSizeLabel->Size = System::Drawing::Size(0, 13);
this->imageSizeLabel->TabIndex = 0;
//
// zoomComboBox
//
this->zoomComboBox->Anchor = System::Windows::Forms::AnchorStyles::None;
this->zoomComboBox->FormattingEnabled = true;
this->zoomComboBox->Items->AddRange(gcnew cli::array< System::Object^ >(8) {
L"10 %", L"20 %", L"50 %", L"70 %", L"100 %",
L"150 %", L"200 %", L"400 %"
});
this->zoomComboBox->Location = System::Drawing::Point(189, 11);
this->zoomComboBox->MaxLength = 5;
this->zoomComboBox->Name = L"zoomComboBox";
this->zoomComboBox->Size = System::Drawing::Size(49, 21);
this->zoomComboBox->TabIndex = 2;
this->zoomComboBox->Text = L"100 %";
this->zoomComboBox->Visible = false;
this->zoomComboBox->SelectedIndexChanged += gcnew System::EventHandler(this, &MyForm::zoomComboBox_SelectedIndexChanged);
this->zoomComboBox->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &MyForm::zoomComboBox_KeyDown);
//
// filterPanel
//
this->filterPanel->Controls->Add(this->histPanel);
this->filterPanel->Controls->Add(this->Ластикpanel);
this->filterPanel->Controls->Add(this->соляризацияPanel);
this->filterPanel->Dock = System::Windows::Forms::DockStyle::Fill;
this->filterPanel->Location = System::Drawing::Point(792, 5);
this->filterPanel->Name = L"filterPanel";
this->filterPanel->Size = System::Drawing::Size(324, 475);
this->filterPanel->TabIndex = 2;
//
// histPanel
//
this->histPanel->Controls->Add(this->label6);
this->histPanel->Controls->Add(this->histValue1);
this->histPanel->Controls->Add(this->histValue2);
this->histPanel->Controls->Add(this->linearhistogramstretchingButton);
this->histPanel->Controls->Add(this->label2);
this->histPanel->Controls->Add(this->label3);
this->histPanel->Dock = System::Windows::Forms::DockStyle::Top;
this->histPanel->Location = System::Drawing::Point(0, 113);
this->histPanel->Margin = System::Windows::Forms::Padding(3, 15, 3, 3);
this->histPanel->Name = L"histPanel";
this->histPanel->Padding = System::Windows::Forms::Padding(0, 10, 0, 0);
this->histPanel->Size = System::Drawing::Size(324, 206);
this->histPanel->TabIndex = 1;
this->histPanel->Visible = false;
//
// label6
//
this->label6->AutoSize = true;
this->label6->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point,
static_cast
this->label6->Location = System::Drawing::Point(217, 120);
this->label6->Name = L"label6";
this->label6->Size = System::Drawing::Size(33, 16);
this->label6->TabIndex = 11;
this->label6->Text = L"max";
//
// histValue1
//
this->histValue1->DecimalPlaces = 2;
this->histValue1->Increment = System::Decimal(gcnew cli::array< System::Int32 >(4) { 10, 0, 0, 0 });
this->histValue1->Location = System::Drawing::Point(88, 85);
this->histValue1->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 255, 0, 0, 0 });
this->histValue1->Name = L"histValue1";
this->histValue1->Size = System::Drawing::Size(46, 20);
this->histValue1->TabIndex = 10;
//
// histValue2
//
this->histValue2->DecimalPlaces = 2;
this->histValue2->Increment = System::Decimal(gcnew cli::array< System::Int32 >(4) { 10, 0, 0, 0 });
this->histValue2->Location = System::Drawing::Point(204, 85);
this->histValue2->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 255, 0, 0, 0 });
this->histValue2->Name = L"histValue2";
this->histValue2->Size = System::Drawing::Size(46, 20);
this->histValue2->TabIndex = 9;
//
// linearhistogramstretchingButton
//
this->linearhistogramstretchingButton->Location = System::Drawing::Point(108, 155);
this->linearhistogramstretchingButton->Name = L"linearhistogramstretchingButton";
this->linearhistogramstretchingButton->Size = System::Drawing::Size(128, 23);
this->linearhistogramstretchingButton->TabIndex = 8;
this->linearhistogramstretchingButton->Text = L"Применить";
this->linearhistogramstretchingButton->UseVisualStyleBackColor = true;
this->linearhistogramstretchingButton->Click += gcnew System::EventHandler(this, &MyForm::linearhistogramstretchingButton_Click);
//
// label2
//
this->label2->AutoSize = true;
this->label2->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point,
static_cast
this->label2->Location = System::Drawing::Point(105, 120);
this->label2->Name = L"label2";
this->label2->Size = System::Drawing::Size(29, 16);
this->label2->TabIndex = 2;
this->label2->Text = L"min";
//
// label3
//
this->label3->Dock = System::Windows::Forms::DockStyle::Top;
this->label3->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,
static_cast
this->label3->Location = System::Drawing::Point(0, 10);
this->label3->Name = L"label3";
this->label3->Size = System::Drawing::Size(324, 20);
this->label3->TabIndex = 0;
this->label3->Text = L"Нормализация гистограммы";
this->label3->TextAlign = System::Drawing::ContentAlignment::MiddleCenter;
//
// Ластикpanel
//
this->Ластикpanel->Controls->Add(this->histValue4);
this->Ластикpanel->Controls->Add(this->ЛастикButton);
this->Ластикpanel->Controls->Add(this->label5);
this->Ластикpanel->Location = System::Drawing::Point(4, 325);
this->Ластикpanel->Name = L"Ластикpanel";
this->Ластикpanel->Size = System::Drawing::Size(281, 147);
this->Ластикpanel->TabIndex = 4;
this->Ластикpanel->Visible = false;
//
// histValue4
//
this->histValue4->DecimalPlaces = 2;
this->histValue4->Location = System::Drawing::Point(116, 35);
this->histValue4->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 10, 0, 0, 0 });
this->histValue4->Name = L"histValue4";
this->histValue4->Size = System::Drawing::Size(46, 20);
this->histValue4->TabIndex = 10;
//
// ЛастикButton
//
this->ЛастикButton->Location = System::Drawing::Point(80, 61);
this->ЛастикButton->Name = L"ЛастикButton";
this->ЛастикButton->Size = System::Drawing::Size(128, 23);
this->ЛастикButton->TabIndex = 9;
this->ЛастикButton->Text = L"Применить";
this->ЛастикButton->UseVisualStyleBackColor = true;
this->ЛастикButton->Click += gcnew System::EventHandler(this, &MyForm::ЛастикButton_Click);
//
// label5
//
this->label5->Dock = System::Windows::Forms::DockStyle::Top;
this->label5->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,
static_cast
this->label5->Location = System::Drawing::Point(0, 0);
this->label5->Name = L"label5";
this->label5->Size = System::Drawing::Size(281, 20);
this->label5->TabIndex = 4;
this->label5->Text = L"Ластик";
this->label5->TextAlign = System::Drawing::ContentAlignment::MiddleCenter;
//
// соляризацияPanel
//
this->соляризацияPanel->Controls->Add(this->button1);
this->соляризацияPanel->Controls->Add(this->соляризация_qmaxValue);
this->соляризацияPanel->Controls->Add(this->label4);
this->соляризацияPanel->Controls->Add(this->label1);
this->соляризацияPanel->Controls->Add(this->соляризация_q1Value);
this->соляризацияPanel->Controls->Add(this->соляризацияParamLabel);
this->соляризацияPanel->Dock = System::Windows::Forms::DockStyle::Top;
this->соляризацияPanel->Location = System::Drawing::Point(0, 0);
this->соляризацияPanel->Margin = System::Windows::Forms::Padding(3, 15, 3, 3);
this->соляризацияPanel->Name = L"соляризацияPanel";
this->соляризацияPanel->Padding = System::Windows::Forms::Padding(0, 10, 0, 0);
this->соляризацияPanel->Size = System::Drawing::Size(324, 113);
this->соляризацияPanel->TabIndex = 0;
this->соляризацияPanel->Visible = false;
//
// button1
//
this->button1->Location = System::Drawing::Point(88, 89);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(128, 23);
this->button1->TabIndex = 7;
this->button1->Text = L"Применить";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
//
// соляризация_qmaxValue
//
this->соляризация_qmaxValue->DecimalPlaces = 1;
this->соляризация_qmaxValue->Increment = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 65536 });
this->соляризация_qmaxValue->Location = System::Drawing::Point(120, 56);
this->соляризация_qmaxValue->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 4, 0, 0, 0 });
this->соляризация_qmaxValue->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 65536 });
this->соляризация_qmaxValue->Name = L"соляризация_qmaxValue";
this->соляризация_qmaxValue->Size = System::Drawing::Size(130, 20);
this->соляризация_qmaxValue->TabIndex = 4;
this->соляризация_qmaxValue->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 0 });
//
// label4
//
this->label4->AutoSize = true;
this->label4->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point,
static_cast
this->label4->Location = System::Drawing::Point(3, 70);
this->label4->Name = L"label4";
this->label4->Size = System::Drawing::Size(114, 16);
this->label4->TabIndex = 3;
this->label4->Text = L"Значение q*max";
//
// label1
//
this->label1->AutoSize = true;
this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9.75F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point,
static_cast
this->label1->Location = System::Drawing::Point(3, 40);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(91, 16);
this->label1->TabIndex = 2;
this->label1->Text = L"Значение q1";
//
// соляризация_q1Value
//
this->соляризация_q1Value->DecimalPlaces = 1;
this->соляризация_q1Value->Increment = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 65536 });
this->соляризация_q1Value->Location = System::Drawing::Point(120, 30);
this->соляризация_q1Value->Maximum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 4, 0, 0, 0 });
this->соляризация_q1Value->Minimum = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 65536 });
this->соляризация_q1Value->Name = L"соляризация_q1Value";
this->соляризация_q1Value->Size = System::Drawing::Size(130, 20);
this->соляризация_q1Value->TabIndex = 1;
this->соляризация_q1Value->Value = System::Decimal(gcnew cli::array< System::Int32 >(4) { 1, 0, 0, 0 });
//
// соляризацияParamLabel
//
this->соляризацияParamLabel->Dock = System::Windows::Forms::DockStyle::Top;
this->соляризацияParamLabel->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,
static_cast
this->соляризацияParamLabel->Location = System::Drawing::Point(0, 10);
this->соляризацияParamLabel->Name = L"соляризацияParamLabel";
this->соляризацияParamLabel->Size = System::Drawing::Size(324, 20);
this->соляризацияParamLabel->TabIndex = 0;
this->соляризацияParamLabel->Text = L"Соляризация";
this->соляризацияParamLabel->TextAlign = System::Drawing::ContentAlignment::MiddleCenter;
//
// imagePanel
//
this->imagePanel->AutoScroll = true;
this->imagePanel->Controls->Add(this->pictureBox);
this->imagePanel->Dock = System::Windows::Forms::DockStyle::Fill;
this->imagePanel->Location = System::Drawing::Point(5, 5);
this->imagePanel->Name = L"imagePanel";
this->imagePanel->Size = System::Drawing::Size(779, 475);
this->imagePanel->TabIndex = 3;
//
// pictureBox
//
this->pictureBox->Location = System::Drawing::Point(34, 40);
this->pictureBox->Name = L"pictureBox";
this->pictureBox->Size = System::Drawing::Size(774, 432);
this->pictureBox->SizeMode = System::Windows::Forms::PictureBoxSizeMode::AutoSize;
this->pictureBox->TabIndex = 0;
this->pictureBox->TabStop = false;
this->pictureBox->MouseMove += gcnew System::Windows::Forms::MouseEventHandler(this, &MyForm::pictureBox_MouseMove);
//
// openFileDialog
//
this->openFileDialog->FileName = L"Image";
this->openFileDialog->Filter = L"Изображения|*.bmp;*.jpg;*.png";
//
// MyForm
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(1121, 561);
this->Controls->Add(this->mainTableLayoutPanel);
this->Controls->Add(this->menuStrip);
this->MainMenuStrip = this->menuStrip;
this->MinimumSize = System::Drawing::Size(800, 600);
this->Name = L"MyForm";
this->Text = L"0105 Крылов Г.В.";
this->menuStrip->ResumeLayout(false);
this->menuStrip->PerformLayout();
this->mainTableLayoutPanel->ResumeLayout(false);
this->mainTableLayoutPanel->PerformLayout();
this->imageInfoTableLayoutPanel->ResumeLayout(false);
this->imageInfoTableLayoutPanel->PerformLayout();
this->filterPanel->ResumeLayout(false);
this->histPanel->ResumeLayout(false);
this->histPanel->PerformLayout();
(cli::safe_cast
(cli::safe_cast
this->Ластикpanel->ResumeLayout(false);
(cli::safe_cast
this->соляризацияPanel->ResumeLayout(false);
this->соляризацияPanel->PerformLayout();
(cli::safe_cast
(cli::safe_cast
this->imagePanel->ResumeLayout(false);
this->imagePanel->PerformLayout();
(cli::safe_cast
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
/// Пункт меню "Файл"
/// Открыть файл
private: System::Void открытьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
if (openFileDialog->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
filename = openFileDialog->SafeFileName;
present = gcnew Bitmap(openFileDialog->FileName);
enlarged = gcnew Bitmap(openFileDialog->FileName);
normal = gcnew Bitmap(openFileDialog->FileName);
pictureBox->Image = present;
imageSizeLabel->Text = present->Width + "x" + present->Height;
сохранитьToolStripMenuItem->Enabled = true;
восстановитьToolStripMenuItem->Enabled = true;
channelselectionorange->Enabled = true;
соляризацияTSMI->Enabled = true;
ЛастикToolStripMenuItem->Enabled = true;
linearhistogramstretchingTSMI->Enabled = true;
gorizontalZoomOutTSMI->Enabled = true;
увеличитьМасштабToolStripMenuItem->Enabled = true;
уменьшитьМасштабToolStripMenuItem->Enabled = true;
zoomComboBox->Visible = true;
соляризацияPanel->Visible = false;
histPanel->Visible = false;
Ластикpanel->Visible = false;
}
}
/// Сохранить файл
private: System::Void сохранитьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
saveFileDialog->FileName = filename;
if (saveFileDialog->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
present->Save(saveFileDialog->FileName);
}
}
/// Восстановить файл
private: System::Void восстановитьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
соляризацияPanel->Visible = false;
histPanel->Visible = false;
Ластикpanel->Visible = false;
соляризация_q1Value->Value = 1;
present = gcnew Bitmap(normal);
imageSizeLabel->Text = present->Width + "x" + present->Height;
UpdateZoom();
}
/// Выйти
private: System::Void выходToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
Close();
}
/// Пункт меню "Инструменты"
/// 1.8.Выделение_каналов_R,G,B_Оранжевый
private: System::Void channelselectionorange_Click(System::Object^ sender, System::EventArgs^ e) {
соляризацияPanel->Visible = false;
histPanel->Visible = false;
Ластикpanel->Visible = false;
histValue4->Value = 0;
for (int x = 0; x < present->Width; x++)
{
// Если стоит галочка "Применить к половине изображения" и мы дошли до половины картинки, то заканичиваем выполнение.
if (halfFilterCheckBox->Checked && x >= present->Width / 2)
break;
for (int y = 0; y < present->Height; y++)
{
Color pixel = present->GetPixel(x, y);
int R = pixel.R;
int G = 0.6471 * pixel.G;
int B = 0;
present->SetPixel(x, y, Color::FromArgb(R, G, B));
}
}
UpdateZoom();
}
/// 2.5.Соляризация
private: System::Void соляризацияTSMI_Click(System::Object^ sender, System::EventArgs^ e) {
temporary = gcnew Bitmap(present);
соляризация_q1Value->Value = 1;
соляризация_qmaxValue->Value = 1;
соляризацияPanel->Visible = true;
histPanel->Visible = false;
Ластикpanel->Visible = false;
histValue4->Value = 0;
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
double q1 = Decimal::ToDouble(соляризация_q1Value->Value);
double qmax = Decimal::ToDouble(соляризация_qmaxValue->Value);
for (int x = 0; x < present->Width; x++)
{
// Если стоит галочка "Применить к половине изображения" и мы дошли до половины картинки, то заканичиваем выполнение.
if (halfFilterCheckBox->Checked && x >= present->Width / 2)
break;
for (int y = 0; y < present->Height; y++)
{
Color pixel = temporary->GetPixel(x, y);
if (q1 <= qmax) {
int R = q1 / qmax * pixel.R; if (R > 255) { R = 255; };
int G = q1 / qmax * pixel.G; if (G > 255) { G = 255; };
int B = q1 / qmax * pixel.B; if (B > 255) { B = 255; };
present->SetPixel(x, y, Color::FromArgb(R, G, B));
}
else {
int R = q1 / qmax * pixel.R; if (R > 255) { R = 255; };
int G = q1 / qmax * pixel.G; if (G > 255) { G = 255; };
int B = q1 / qmax * pixel.B; if (B > 255) { B = 255; };
present->SetPixel(x, y, Color::FromArgb(R, G, B));
}
}
}
UpdateZoom();
}
// 3.5.Прямоугольный ластик
int eraserRadius = 0;
private: System::Void ЛастикToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
соляризацияPanel->Visible = false;
histPanel->Visible = false;
Ластикpanel->Visible = true;
histValue4->Value = 0;
if (!eraser)
eraser = true;
else
eraser = false;
}
private: System::Void ЛастикButton_Click(System::Object^ sender, System::EventArgs^ e) {
eraserRadius = int(histValue4->Value);
}
/// 4.2.линейная растяжка гистограммы
private: System::Void linearhistogramstretchingButton_Click(System::Object^ sender, System::EventArgs^ e) {
/*linearhistogramstretching();*/
int fmin = Decimal::ToDouble(histValue1->Value);
int fmax = Decimal::ToDouble(histValue2->Value);
int fr = 0, gr = 0, fg = 0, gg = 0, fb = 0, gb = 0;
for (int x = 0; x < present->Width; x++)
{
if (halfFilterCheckBox->Checked && x >= present->Width / 2) break;
for (int y = 0; y < present->Height; y++)
{
Color cl1 = temporary->GetPixel(x, y);
fr = cl1.R;
fg = cl1.G;
fb = cl1.B;
if (fmax != fmin)
{
gr = (fr - fmin) * 255 / (fmax - fmin);
}
if (fmax != fmin)
{
gg = (fg - fmin) * 255 / (fmax - fmin);
}
if (fmax != fmin)
{
gb = (fb - fmin) * 255 / (fmax - fmin);
}
if (gr < 0) gr = 0;
if (gr > 255) gr = 255;
if (gg < 0) gg = 0;
if (gg > 255) gg = 255;
if (gb < 0) gb = 0;
if (gb > 255) gb = 255;
Color cl2 = Color::FromArgb(gr, gg, gb);
present->SetPixel(x, y, cl2);
}
}
UpdateZoom();
}
private: System::Void linearhistogramstretchingTSMI_Click(System::Object^ sender, System::EventArgs^ e) {
соляризацияPanel->Visible = false;
histPanel->Visible = true;
Ластикpanel->Visible = false;
histValue4->Value = 0;
temporary = gcnew Bitmap(present);
}
/// 5.5.Уменьшить мастштаб по горизонтали
private: System::Void gorizontalZoomOutTSMI_Click(System::Object^ sender, System::EventArgs^ e) {
соляризацияPanel->Visible = false;
histPanel->Visible = false;
Ластикpanel->Visible = false;
histValue4->Value = 0;
Bitmap^ newBitmap = gcnew Bitmap(present, System::Drawing::Size(0.5 * present->Width, present->Height));
Color cl1, cl2;
float R, G, B;
for (int y = 0; y < present->Height; y++)
{
for (int x = 0; x < present->Width; x += 2)
{
cl1 = present->GetPixel(x, y);
cl2 = present->GetPixel(x + 1, y);
R = (cl1.R + cl2.R) / 2;
B = (cl1.B + cl2.B) / 2;
G = (cl1.G + cl2.G) / 2;
newBitmap->SetPixel(x / 2, y, Color::FromArgb(R, G, B));
}
}
present = gcnew Bitmap(newBitmap);
imageSizeLabel->Text = present->Width + "x" + present->Height;
UpdateZoom();
}
/// Пункт меню "Вид"
/// Увеличить масштаб
private: System::Void увеличитьМасштабToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
int newIndex = zoomComboBox->SelectedIndex + 1;
if (newIndex < zoomComboBox->Items->Count)
zoomComboBox->SelectedIndex = newIndex;
}
/// Уменьшить масштаб
private: System::Void уменьшитьМасштабToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
int newIndex = zoomComboBox->SelectedIndex - 1;
if (newIndex >= 0)
zoomComboBox->SelectedIndex = newIndex;
}
/// При движении мышкой по области картинки отображаем значения цветов пикселя и его координаты.
private: System::Void pictureBox_MouseMove(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {
if (Ластикpanel->Visible == false) {
if (present)
{
if ((e->X > 0) && (e->X < present->Width)
&& (e->Y > 0) && (e->Y < present->Height)) {
int x = double(present->Width) / double(enlarged->Width) * e->X;
int y = double(present->Height) / double(enlarged->Height) * e->Y;
Color pixelColor = present->GetPixel(x, y);
String^ pixelCoords = "X: " + x + ", Y: " + y;
String^ pixelColors = ", R: " + pixelColor.R + ", G: " + pixelColor.G + ", B: " + pixelColor.B;
pixelInfoLabel->Text = pixelCoords + pixelColors;
}
}
}
if (Ластикpanel->Visible == true) {
if (eraser && (pictureBox->Image)) //Ластик
{
Bitmap^ bitmap1 = gcnew Bitmap(pictureBox->Image);
for (int i = -eraserRadius; i < eraserRadius; i++)
for (int j = -eraserRadius; j < eraserRadius; j++)
{
if ((e->X + i > 0) && (e->X + i < bitmap1->Width)
&& (e->Y + j > 0) && (e->Y + j < bitmap1->Height))
{
// если нажата левая кнопка мыши
if (e->Button == System::Windows::Forms::MouseButtons::Left) {
bitmap1->SetPixel(e->X + i, e->Y + j, Color::White);
}
}
}
present = bitmap1;
UpdateZoom();
}
}
}
private: System::Void zoomComboBox_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyCode != Keys::Enter)
return;
String^ newText = zoomComboBox->Text;
newText = newText->Replace(" ", "");
if (newText->IndexOf("%") == newText->Length - 1)
newText = newText->Replace("%", "");
int value;
if (Int32::TryParse(newText, value))
{
if (value < 10)
value = 10;
else if (value > 400)
value = 400;
Zoom = value;
UpdateZoom();
}
zoomComboBox->Text = Zoom + " %";
}
private: System::Void zoomComboBox_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
String^ newText = zoomComboBox->Text->Replace("%", "");
int value;
if (Int32::TryParse(newText, value))
{
if (value < 10)
value = 10;
else if (value > 400)
value = 400;
Zoom = value;
UpdateZoom();
}
else
{
zoomComboBox->Text = Zoom + " %";
}
}
private: System::Void UpdateZoom()
{
int newWidth = double(present->Width) * double(Zoom) / double(100);
int newHeight = double(present->Height) * double(Zoom) / double(100);
enlarged = gcnew Bitmap(present, System::Drawing::Size(newWidth, newHeight));
pictureBox->Image = enlarged;
pictureBox->Refresh();
}
// Справка
private: System::Void справкаToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
MessageBox::Show("1.8.Выделение_каналов_R,G,B_Оранжевый: Фильтр выделяет ораньжевый канал на изображении. 2.5.Соляризация: фильтр увеличивает или уменьшает яркость изображения. 3.5.Прямоугольный ластик: фильтр стирает прямоугольный участок пикселей в выбраной области. 4.2.Линейная растяжка гистограммы: уровням исходного изображения, лежащим в интервале [fмин, fмакс], присваивают новые значения с тем, чтобы охватить весь возможный интервал изменения яркости [0, 255]. 5.5.Уменьшить мастштаб по горизонтали: фильтр уменьшает ширину изображения в два раза");
}
};
}
2.3. Эксплуатационные документы
2.3.1. Описание применения
2.3.1.1. Назначение программы
Данная программа является простейшим графическим редактором, который обрабатывает изображения с помощью фильтрации.
2.3.1.2. Условия применения
Технический ограничений при использовании данной програмы нет, однако она адаптирована для Visual Studio версии 2019 года.
2.3.1.3. Описание задачи
Главная задача состояла в написании понятно и оптимизированного кода для фильтров в программе.
2.3.1.4 Входные и выходные данные
Исходное изображение и изображение с применением фильтров.
2.3.2. Руководство оператора
2.3.2.1. Назначение программы
Программа является простейшим графическим редакторов, в которой должно содержаться 5 фильтров.
2.3.2.2. Условия выполнения программы
Минимальнымы требованиями являются объем оперативной память не менен 500Мб.
2.3.2.3. Выполнение программы
Для открытия изображения нужно нажать на «Открыть» в меню и выбрать нужный файл в диалоговом окне.
Для сохранения изображеняи нужно нажать «Сохранить» и выбрать папку сохраняемого файла.
При нажатие «Восстановить» происходит возврат к исходному изображению.
При нажатии «Выход» происходит завершение работы программы.
Пункт меню «Инструменты» содержит 5 фильтров: выделение каналов R, G, B, оранжевый, соляризация, фильтр линейная растяжка гистограммы, прямоугольный ластик, уменьшение изображения по горизонтали.
Пункт меню «Вид» реализует увеличение или уменьшения изображения в pictureBox.
Пункт меню «Спавка» сожержит краткую информацию о программе.
2.3.2.4. Выполнение программы
ЗАКЛЮЧЕНИЕ
В ходе работы над курсовым проектом были закреплены знания полученные в ходе изучения курса “Информатика” и “Информационные технологии”. Однако стоит отметить, что программа является лишь тренировкой и обучением стандартным способом обработки изображения, на основе которых в дальнейшем можно будет создать действительно сложную и уникальную программу.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Методические указания для выполнения курсового проектирования 2021 г.
2. Свободная энциклопедия // Википедия
URL: https://ru.wikipedia.org
3. Форум программистов и сисадминов // Киберфорум
URL: https://www.cyberforum.ru/