# Лабораторная работа 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`; при этом это не противоречит задаче разработки редактора и демонстрирует полноценную обработку графических данных.