Files
Minint/Report/lab2/zivro-lab2-report.md
2026-04-07 21:00:49 +03:00

148 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Лабораторная работа 2
## Способы и средства хранения и обработки графических данных
### Вариант ИВ1: разработка растрового редактора
## 1. Цель и практический результат
Цель работы - разработать растровый редактор, выполняющий создание, загрузку, редактирование и сохранение графического контейнера с пиксельными данными, а также реализовать базовые инструменты рисования и редактирования фрагментов.
Практический результат:
- разработано настольное приложение `Minint` на `C#` + `Avalonia`;
- реализован собственный бинарный формат контейнера `.minint` с чтением/записью;
- реализованы инструменты `Brush`, `Eraser`, `Fill`, `Select`, `Copy/Cut/Paste`;
- подготовлена документация с UML-диаграммами и приложением исходного кода.
![Скриншот ПО](Screenshot.png)
## 2. Соответствие варианту ИВ1 и замечание по структуре контейнера
По методическим указаниям ИВ1 требуется использовать структуру пикселя и контейнера из одного из вариантов `КВ1КВ4`.
В текущем проекте фактически реализован палитровый контейнер с `RGBA`-палитрой и индексами пикселей (`MinintContainer`/`MinintDocument`/`MinintLayer`), что не совпадает буквально с описаниями `КВ1КВ4`, но полностью закрывает функциональные требования ИВ1 (создание, редактирование, загрузка, сохранение, инструменты рисования, работа с фрагментами).
Это ограничение фиксируется в отчёте явно, чтобы не было расхождения между кодом и документацией.
## 3. Выполнение основных требований ИВ1
### 3.1 Создание, загрузка и сохранение контейнера
- создание нового контейнера выполняется через `EditorViewModel.NewContainer(...)`;
- загрузка/сохранение выполняется через `MinintSerializer` (собственная реализация чтения/записи);
- контейнер хранит общие размеры, набор документов (кадров), палитры и слои.
Реализация: `Minint/ViewModels/EditorViewModel.cs`, `Minint.Infrastructure/Serialization/MinintSerializer.cs`, `Minint.Core/Models/*`.
### 3.2 Редактирование единичных пикселей
- инструмент `Brush` изменяет значения пикселей маской радиуса;
- инструмент `Eraser` записывает индекс прозрачного цвета (`0`);
- выбор цвета выполняется через текущий `SelectedColor` и палитру документа.
Реализация: `Minint.Core/Services/Impl/DrawingService.cs`, `Minint/ViewModels/EditorViewModel.cs`.
### 3.3 Непрерывная отрисовка "кистью"
- при перемещении мыши по зажатой кнопке вызывается последовательная обработка точек;
- маска кисти вычисляется как круг по радиусу;
- поддерживается визуальный preview маски инструмента.
Реализация: `Minint/Controls/PixelCanvas.cs`, `Minint/Core/Services/Impl/DrawingService.cs`, `Minint/ViewModels/EditorViewModel.cs`.
### 3.4 Закраска области ("заливка")
- реализован алгоритм flood fill (4-связность);
- заливка ограничена областью одинакового исходного индекса;
- алгоритм работает в границах изображения.
Реализация: `Minint.Core/Services/Impl/FloodFillService.cs`.
### 3.5 Выделение, копирование/вырезание и вставка фрагмента
- реализована рамка выделения (`SelectionRect`);
- данные буфера обмена хранятся в palette-independent виде (`ClipboardFragment`, `RGBA`);
- вставка поддерживает предпросмотр и подтверждение позиции;
- прозрачные пиксели фрагмента при вставке пропускаются.
Реализация: `Minint/ViewModels/EditorViewModel.cs`, `Minint/Controls/PixelCanvas.cs`, `Minint.Core/Services/Impl/FragmentService.cs`.
## 4. Структура контейнера и пикселя
### 4.1 Структура контейнера `.minint`
Контейнер состоит из:
1. Заголовка файла:
- сигнатура `MININT`;
- версия формата;
- ширина и высота;
- количество документов;
- резерв.
2. Набора документов:
- имя документа;
- задержка кадра;
- палитра `RGBA`;
- набор слоёв.
3. Набора слоёв:
- имя слоя;
- признак видимости;
- непрозрачность;
- массив индексов пикселей.
### 4.2 Структура пикселя
Логически пиксель хранится как индекс в палитре документа (`int` в ОЗУ, переменная ширина 1..4 байта в файле), а итоговый цвет формируется по таблице `RgbaColor`.
## 5. Основные алгоритмы
1. Запись контейнера в бинарный поток (`WriteHeader`, `WriteDocument`, `WriteLayer`).
2. Чтение и валидация контейнера (`ReadHeader`, `ReadDocument`, `ReadLayer`).
3. Круглая кисть по маске радиуса.
4. Очистка пикселей ластиком.
5. Flood fill по очереди.
6. Копирование/вставка фрагмента с отсечением по границам.
7. Композиция слоёв при обновлении холста.
## 6. UML-диаграммы (PlantUML)
### 6.1 Основной рабочий цикл редактора
`Report/lab2/uml/lr2-editor-workflow.puml`
![Основной рабочий цикл](uml/lr2-editor-workflow.png)
### 6.2 Формат контейнера и сериализация
`Report/lab2/uml/lr2-container-serialization.puml`
![Контейнер и сериализация](uml/lr2-container-serialization.png)
### 6.3 Инструменты рисования и заливки
`Report/lab2/uml/lr2-tools-and-fill.puml`
![Инструменты и заливка](uml/lr2-tools-and-fill.png)
### 6.4 Выделение и буфер обмена фрагментов
`Report/lab2/uml/lr2-selection-copy-paste.puml`
![Выделение и copy/paste](uml/lr2-selection-copy-paste.png)
## 7. Проверка работоспособности
Для проверки корректности реализации используются модульные тесты проекта `Minint.Tests`:
- `DrawingTests`;
- `FloodFillTests`;
- `FragmentServiceTests`;
- `SerializerTests`;
- `CompositorTests`;
- `ExportTests`.
## 8. Вывод
В рамках ЛР2 (вариант ИВ1) реализовано рабочее приложение-растровый редактор с собственным контейнером данных и базовым набором инструментов редактирования изображения. Практические требования ИВ1 закрыты на уровне пользовательского сценария и программной реализации.
Отдельно зафиксировано, что выбранная структура контейнера является палитровой и не повторяет буквально формулировки `КВ1КВ4`; при этом это не противоречит задаче разработки редактора и демонстрирует полноценную обработку графических данных.