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

8.9 KiB
Raw Blame History

Лабораторная работа 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

Выделение и copy/paste

7. Проверка работоспособности

Для проверки корректности реализации используются модульные тесты проекта Minint.Tests:

  • DrawingTests;
  • FloodFillTests;
  • FragmentServiceTests;
  • SerializerTests;
  • CompositorTests;
  • ExportTests.

8. Вывод

В рамках ЛР2 (вариант ИВ1) реализовано рабочее приложение-растровый редактор с собственным контейнером данных и базовым набором инструментов редактирования изображения. Практические требования ИВ1 закрыты на уровне пользовательского сценария и программной реализации.

Отдельно зафиксировано, что выбранная структура контейнера является палитровой и не повторяет буквально формулировки КВ1КВ4; при этом это не противоречит задаче разработки редактора и демонстрирует полноценную обработку графических данных.