148 lines
8.9 KiB
Markdown
148 lines
8.9 KiB
Markdown
# Лабораторная работа 2
|
||
## Способы и средства хранения и обработки графических данных
|
||
### Вариант ИВ1: разработка растрового редактора
|
||
|
||
## 1. Цель и практический результат
|
||
|
||
Цель работы - разработать растровый редактор, выполняющий создание, загрузку, редактирование и сохранение графического контейнера с пиксельными данными, а также реализовать базовые инструменты рисования и редактирования фрагментов.
|
||
|
||
Практический результат:
|
||
|
||
- разработано настольное приложение `Minint` на `C#` + `Avalonia`;
|
||
- реализован собственный бинарный формат контейнера `.minint` с чтением/записью;
|
||
- реализованы инструменты `Brush`, `Eraser`, `Fill`, `Select`, `Copy/Cut/Paste`;
|
||
- подготовлена документация с UML-диаграммами и приложением исходного кода.
|
||
|
||

|
||
|
||
## 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`
|
||
|
||

|
||
|
||
### 6.2 Формат контейнера и сериализация
|
||
|
||
`Report/lab2/uml/lr2-container-serialization.puml`
|
||
|
||

|
||
|
||
### 6.3 Инструменты рисования и заливки
|
||
|
||
`Report/lab2/uml/lr2-tools-and-fill.puml`
|
||
|
||

|
||
|
||
### 6.4 Выделение и буфер обмена фрагментов
|
||
|
||
`Report/lab2/uml/lr2-selection-copy-paste.puml`
|
||
|
||

|
||
|
||
## 7. Проверка работоспособности
|
||
|
||
Для проверки корректности реализации используются модульные тесты проекта `Minint.Tests`:
|
||
|
||
- `DrawingTests`;
|
||
- `FloodFillTests`;
|
||
- `FragmentServiceTests`;
|
||
- `SerializerTests`;
|
||
- `CompositorTests`;
|
||
- `ExportTests`.
|
||
|
||
## 8. Вывод
|
||
|
||
В рамках ЛР2 (вариант ИВ1) реализовано рабочее приложение-растровый редактор с собственным контейнером данных и базовым набором инструментов редактирования изображения. Практические требования ИВ1 закрыты на уровне пользовательского сценария и программной реализации.
|
||
|
||
Отдельно зафиксировано, что выбранная структура контейнера является палитровой и не повторяет буквально формулировки `КВ1–КВ4`; при этом это не противоречит задаче разработки редактора и демонстрирует полноценную обработку графических данных.
|