8.9 KiB
Лабораторная работа 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
Контейнер состоит из:
- Заголовка файла:
- сигнатура
MININT; - версия формата;
- ширина и высота;
- количество документов;
- резерв.
- сигнатура
- Набора документов:
- имя документа;
- задержка кадра;
- палитра
RGBA; - набор слоёв.
- Набора слоёв:
- имя слоя;
- признак видимости;
- непрозрачность;
- массив индексов пикселей.
4.2 Структура пикселя
Логически пиксель хранится как индекс в палитре документа (int в ОЗУ, переменная ширина 1..4 байта в файле), а итоговый цвет формируется по таблице RgbaColor.
5. Основные алгоритмы
- Запись контейнера в бинарный поток (
WriteHeader,WriteDocument,WriteLayer). - Чтение и валидация контейнера (
ReadHeader,ReadDocument,ReadLayer). - Круглая кисть по маске радиуса.
- Очистка пикселей ластиком.
- Flood fill по очереди.
- Копирование/вставка фрагмента с отсечением по границам.
- Композиция слоёв при обновлении холста.
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; при этом это не противоречит задаче разработки редактора и демонстрирует полноценную обработку графических данных.




