Добавил:
baraevaliza
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы и курсачи 2022-2023 / 2 сем / Baraeva_Elizaveta_cw
.pdf
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
КУРСОВАЯ РАБОТА
по дисциплине «Программирование»
Тема: Обработка изображений
Студентка гр. 2383
Бараева Е.Н.
Преподаватель
Азаревич А.Д.
Санкт-Петербург
2023

2
ЗАДАНИЕ
НА КУРСОВУЮ РАБОТУ
Студентка Бараева Е.Н.
Группа 2383
Тема работы: Работа с изображениями в языке Си
Исходные данные:
Программа должна иметь CLI или GUI.
Программа должна реализовывать весь следующий функционал по обработке
png-файла
Общие сведения
• Формат картинки PNG
• без сжатия
• файл всегда соответствует формату PNG
• обратите внимание на выравнивание; мусорные данные, если их
необходимо дописать в файл для выравнивания, должны быть нулями.
• все поля стандартных PNG заголовков в выходном файле должны иметь
те же значения что и во входном (разумеется кроме тех, которые должны
быть изменены).
Программа должна реализовывать следующий функционал по обработке PNGфайла
(1) Рисование окружности. Окружность определяется:
• либо координатами левого верхнего и правого нижнего угла квадрата, в
который она вписана, либо координатами ее центра и радиусом
• толщиной линии окружности
• цветом линии окружности
• окружность может быть залитой или нет

3
• цветом которым залита сама окружность, если пользователем выбрана
залитая окружность
(2) Фильтр rgb-компонент. Этот инструмент должен позволять для всего
изображения либо установить в 0 либо установить в 255 значение заданной
компоненты. Функционал определяется
• Какую компоненту требуется изменить
• В какой значение ее требуется изменить
(3) Разделяет изображение на N*M частей. Реализация: либо провести линии
заданной толщины, тем самым разделив изображение либо сохранение каждой
части в отдельный файл. -- по желанию студента (можно и оба варианта).
Функционал определяется:
• Количество частей по “оси” Y
• Количество частей по “оси” X
• Толщина линии
• Цвет линии
• Либо путь куда сохранить кусочки
Содержание пояснительной записки:
Содержание, Введение, Реализация, Примеры, Заключение, Список
использованных источников, Приложение А.
Предполагаемый объем пояснительной записки:
Не менее 10 страниц.
Дата выдачи задания: 22.03.2023
Дата сдачи реферата: 17.05.2023

4
Дата защиты реферата: 19.05.2023
Студентка
Бараева Е.Н.
Преподаватель
Азаревич А.Д.

5
АННОТАЦИЯ
В данной курсовой работе были рассмотрены методы обработки
изображений формата PNG. Реализованная программа работает изображениями
без сжатия, с глубиной цвета 8 бит. Пользователь взаимодействует с
программой с помощью CLI, который был написан с помощью библиотеки
getopt.h. В программе предусмотрена обработка некорректных входных
данных, возможность вывода подробной информации о PNG файле.

6
СОДЕРЖАНИЕ
Введение
7
1.
Реализация
8
1.1.
Рисование окружности
8
1.2.
Наложение фильтра
9
1.3.
Разделение изображения на части
9
1.4.
Взаимодействие с программой
9
1.5.
Дополнительные функции
11
1.6.
Соглашение
11
2.
Примеры
13
Заключение
17
Список использованных источников
18
Приложение А. Исходный код программы
19

7
ВВЕДЕНИЕ
Цель работы.
Целью данной работы является создание программы на языке Си, которая
обрабатывает изображения формата PNG в зависимости от поданных
аргументов.
Задачи.
Для достижения поставленной цели требуется решить следующие задачи:
освоить работу с библиотекой getopt.h и libpng; научиться исправлять
проблемы, которые могут возникнуть при некорректном вводе пользователем;
научиться работать с изображениями формата PNG; научиться правильно
считывать и записывать данные из файла и в файл.

8
1. РЕАЛИЗАЦИЯ
1.1. Рисование окружности
1.1.1) put_pixel
Функция устанавливает заданные значения цветов в пиксель.
1.1.2) xLine
Функция рисует горизонтальную линию заданного цвета шириной в 1 и
длиной от одного переданного пикселя до другого переданного пикселя.
1.1.3) yLine
Функция рисует вертикальную линию заданного цвета шириной в 1 и
длиной от одного переданного пикселя до другого переданного пикселя.
1.1.4) fill_circle
Функция, используя рекурсивный метод заливки цветом, заполняет
окружность переданным цветом.
1.1.5) circle_part
Функция рисует одну четвертую окружности заданной ширины и цвета в
зависимости от переданной четверти. Эта функция создана из-за того, что при
вычислении центра и радиуса окружности иногда (в зависимости от длины
стороны квадрата) получаются не целые числа, и для того, чтобы окружность
была вписана в квадрат, было принято решение рисовать четверти окружностей
из 4 пикселей максимально приближенных к истинному центру. Для
реализации данной функции был изучен алгоритм Брезенхема, на его основе и
была написана функция. Функция, вычисляя внешний и внутренний радиусы
окружностей, заполняет между ними пространство, вызывая функции xLine,
yLine.
1.1.6) circle
Функция рисует окружность заданной ширины и цвета и если был подан
цвет закраски, то и закрашивает ее. Сначала функция определяет, был подан
центр и радиус или координаты углов квадрата. Затем если были поданы
координаты квадрата и если разница между иксами нечетная, то вызывается

9
функция circle_part 4 раза, а затем заливается, если надо, а если разница между
иксами четная, то функция вычисляет центр и радиус окружности. Когда у
окружности известны радиус и центр, то функция рисует окружность, вычисляя
внешний и внутренний радиусы, и заполняет пространство между ними
нужным цветом. В конце если требуется заливка, то вызывается функция
fill_circle.
1.2. Наложение фильтра
1.2.1) filter
Функция в зависимости от переданного флаг устанавливает в 0 или в 255
значение переданного цвета. С помощью switch происходит определение, какой
цвет нужно изменить, а затем двойным циклом каждому цвету в пикселе
устанавливается переданное значение.
1.3. Разделение изображения на части
1.3.1) draw_vertical_line
Функция рисует вертикальную линию шириной в 1 и длиной в длину
изображения пиксель заданного цвета.
1.3.2) draw_horizontal_line
Функция рисует горизонтальную линию шириной в 1 и длиной в ширину
изображения пиксель заданного цвета.
1.3.3) split
Функция разделяет изображение линиями заданной толщины и заданным
цветом на части. Для проведения вертикальных и горизонтальных линии
вычислялись длины кусочков, затем проводились вертикальные и
горизонтальные линии с помощью функций draw_vertical_line и
draw_horizontal_line.
1.4. Взаимодействие с программой
1.4.1) main

10
Функция принимает аргументы с консоли, затем в зависимости от
первого переданного флага, функция вызывает case_circle, case_filter, case_split,
help, info. Всем, за исключением функции help, дальше передавались
аргументы, которые были переданы в функцию main. Если был передан
неверный флаг, то на экране появляется сообщение об ошибке и вызывается
функция help.
1.4.2) case_circle
Функция считывает и обрабатывает, записывая в переменные, оставшиеся
данные с консоли. С помощью цикла и switch и дополнительных функций
обрабатываются данные. После их обработки данные проверяются на
количество и корректность. Если же их недостаточно или были введены не все,
то выводится сообщение об ошибке. Затем создается структура image и в нее
записываются данные из PNG-файла, вызывается функция рисования
окружности, вызывается функция записи данных из структуры в PNG-файл.
1.4.3) case_filter
Функция считывает и обрабатывает, записывая в переменные, оставшиеся
данные с консоли. С помощью цикла и switch и дополнительных функций
обрабатываются данные. После их обработки данные проверяются на
количество и корректность. Если же их недостаточно или были введены не все,
то выводится сообщение об ошибке. Затем создается структура image и в нее
записываются данные из PNG-файла, вызывается функция filter, вызывается
функция записи данных из структуры в PNG-файл.
1.4.4) case_split
Функция считывает и обрабатывает, записывая в переменные, оставшиеся
данные с консоли. С помощью цикла и switch и дополнительных функций
обрабатываются данные. После их обработки данные проверяются на
количество и корректность. Если же их недостаточно или были введены не все,
то выводится сообщение об ошибке. Затем создается структура image и в нее
записываются данные из PNG-файла, вызывается функция разделения
изображения, вызывается функция записи данных из структуры в PNG-файл.
Соседние файлы в папке 2 сем
