Отчёт
This commit is contained in:
BIN
Report/lab2/Screenshot.png
Normal file
BIN
Report/lab2/Screenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 400 KiB |
38
Report/lab2/generate-pdf.sh
Executable file
38
Report/lab2/generate-pdf.sh
Executable file
@@ -0,0 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REPORT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||
ROOT_DIR="$(cd "${REPORT_DIR}/.." && pwd)"
|
||||
|
||||
INPUT_MD="${SCRIPT_DIR}/zivro-lab2-report.md"
|
||||
WITH_CODE_MD="${SCRIPT_DIR}/zivro-lab2-report-with-code.md"
|
||||
OUTPUT_PDF="${SCRIPT_DIR}/zivro-lab2-report.pdf"
|
||||
|
||||
echo "[1/3] Генерация PNG из UML..."
|
||||
python3 "${REPORT_DIR}/render_uml_png.py" \
|
||||
--input-dir "${SCRIPT_DIR}/uml" \
|
||||
--glob "*.puml"
|
||||
|
||||
echo "[2/3] Обновление версии отчёта с листингом кода..."
|
||||
python3 "${REPORT_DIR}/append_sources_to_report.py" \
|
||||
--input "${INPUT_MD}" \
|
||||
--output "${WITH_CODE_MD}" \
|
||||
--base "${ROOT_DIR}" \
|
||||
--include "Minint/**/*.cs" \
|
||||
--include "Minint.Core/**/*.cs" \
|
||||
--include "Minint.Infrastructure/**/*.cs" \
|
||||
--include "Minint.Tests/**/*.cs"
|
||||
|
||||
echo "[3/3] Генерация PDF..."
|
||||
pandoc "${WITH_CODE_MD}" \
|
||||
-f markdown+implicit_figures+link_attributes+tex_math_dollars \
|
||||
-o "${OUTPUT_PDF}" \
|
||||
--pdf-engine=xelatex \
|
||||
--toc \
|
||||
-V geometry:left=1.5cm,right=1.5cm,top=1.5cm,bottom=1.5cm \
|
||||
-V mainfont="DejaVu Serif" \
|
||||
-V monofont="DejaVu Sans Mono" \
|
||||
-H "${REPORT_DIR}/header.tex"
|
||||
|
||||
echo "Готово: ${OUTPUT_PDF}"
|
||||
BIN
Report/lab2/uml/lr2-container-serialization.png
Normal file
BIN
Report/lab2/uml/lr2-container-serialization.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 78 KiB |
42
Report/lab2/uml/lr2-container-serialization.puml
Normal file
42
Report/lab2/uml/lr2-container-serialization.puml
Normal file
@@ -0,0 +1,42 @@
|
||||
@startuml
|
||||
title ЛР2 ИВ1: структура контейнера и сериализация
|
||||
|
||||
rectangle "Файл .minint" {
|
||||
rectangle "Header" as H
|
||||
rectangle "Documents[]" as D
|
||||
}
|
||||
|
||||
rectangle "Header" {
|
||||
card "Signature: MININT"
|
||||
card "Version"
|
||||
card "Width, Height"
|
||||
card "DocumentCount"
|
||||
card "Reserved[8]"
|
||||
}
|
||||
|
||||
rectangle "Document" {
|
||||
card "Name"
|
||||
card "FrameDelayMs"
|
||||
card "PaletteCount"
|
||||
card "Palette RGBA[]"
|
||||
card "LayerCount"
|
||||
card "Layers[]"
|
||||
}
|
||||
|
||||
rectangle "Layer" {
|
||||
card "Name"
|
||||
card "IsVisible"
|
||||
card "Opacity"
|
||||
card "PixelIndices[]"
|
||||
}
|
||||
|
||||
H --> D
|
||||
D --> "Document"
|
||||
"Document" --> "Layer"
|
||||
|
||||
note bottom
|
||||
PixelIndices хранят индексы палитры.
|
||||
Ширина индекса в файле: 1..4 байта
|
||||
в зависимости от размера палитры.
|
||||
end note
|
||||
@enduml
|
||||
BIN
Report/lab2/uml/lr2-editor-workflow.png
Normal file
BIN
Report/lab2/uml/lr2-editor-workflow.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 74 KiB |
28
Report/lab2/uml/lr2-editor-workflow.puml
Normal file
28
Report/lab2/uml/lr2-editor-workflow.puml
Normal file
@@ -0,0 +1,28 @@
|
||||
@startuml
|
||||
title ЛР2 ИВ1: основной рабочий цикл растрового редактора
|
||||
|
||||
start
|
||||
:Запуск приложения;
|
||||
:Инициализация EditorViewModel и PixelCanvas;
|
||||
|
||||
repeat
|
||||
:Ожидание действий пользователя;
|
||||
if (Выбран файл контейнера?) then (да)
|
||||
:Чтение .minint через MinintSerializer;
|
||||
:Построение модели документа;
|
||||
endif
|
||||
|
||||
if (Режим редактирования?) then (да)
|
||||
:Инструмент Brush/Eraser/Fill/Select;
|
||||
:Изменение пикселей активного слоя;
|
||||
:Обновление холста (composite);
|
||||
endif
|
||||
|
||||
if (Сохранить?) then (да)
|
||||
:Запись контейнера в .minint;
|
||||
endif
|
||||
repeat while (Продолжать работу?) is (да)
|
||||
|
||||
:Штатное завершение;
|
||||
stop
|
||||
@enduml
|
||||
BIN
Report/lab2/uml/lr2-selection-copy-paste.png
Normal file
BIN
Report/lab2/uml/lr2-selection-copy-paste.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
26
Report/lab2/uml/lr2-selection-copy-paste.puml
Normal file
26
Report/lab2/uml/lr2-selection-copy-paste.puml
Normal file
@@ -0,0 +1,26 @@
|
||||
@startuml
|
||||
title ЛР2 ИВ1: выделение, копирование и вставка
|
||||
|
||||
start
|
||||
:Пользователь выбирает Select;
|
||||
:Формирование прямоугольника выделения;
|
||||
|
||||
if (Copy/Cut?) then (да)
|
||||
:Пройти выделенную область;
|
||||
:Преобразовать индексы в RGBA;
|
||||
:Сохранить ClipboardFragment;
|
||||
if (Cut?) then (да)
|
||||
:Очистить выделенную область (индекс 0);
|
||||
endif
|
||||
endif
|
||||
|
||||
if (Paste?) then (да)
|
||||
:Показать "плавающий" фрагмент;
|
||||
:Пользователь задаёт позицию;
|
||||
:CommitPaste -> запись в слой;
|
||||
:Прозрачные пиксели пропустить;
|
||||
endif
|
||||
|
||||
:Обновить холст;
|
||||
stop
|
||||
@enduml
|
||||
BIN
Report/lab2/uml/lr2-tools-and-fill.png
Normal file
BIN
Report/lab2/uml/lr2-tools-and-fill.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
24
Report/lab2/uml/lr2-tools-and-fill.puml
Normal file
24
Report/lab2/uml/lr2-tools-and-fill.puml
Normal file
@@ -0,0 +1,24 @@
|
||||
@startuml
|
||||
title ЛР2 ИВ1: обработка инструментов рисования
|
||||
|
||||
start
|
||||
:Событие мыши в PixelCanvas;
|
||||
:Преобразование координат экрана -> пиксель;
|
||||
|
||||
if (Инструмент == Brush?) then (да)
|
||||
:Вычислить маску кисти (круг);
|
||||
:Записать выбранный индекс цвета;
|
||||
elseif (Инструмент == Eraser?) then (да)
|
||||
:Вычислить маску кисти (круг);
|
||||
:Записать индекс 0 (прозрачный);
|
||||
elseif (Инструмент == Fill?) then (да)
|
||||
:Запустить FloodFillService.Fill;
|
||||
:BFS по 4-связным соседям;
|
||||
:Перекрасить только область target-индекса;
|
||||
else (Select)
|
||||
:Передать управление блоку выделения;
|
||||
endif
|
||||
|
||||
:Обновить итоговый буфер и холст;
|
||||
stop
|
||||
@enduml
|
||||
4882
Report/lab2/zivro-lab2-report-with-code.md
Normal file
4882
Report/lab2/zivro-lab2-report-with-code.md
Normal file
File diff suppressed because it is too large
Load Diff
147
Report/lab2/zivro-lab2-report.md
Normal file
147
Report/lab2/zivro-lab2-report.md
Normal file
@@ -0,0 +1,147 @@
|
||||
# Лабораторная работа 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`; при этом это не противоречит задаче разработки редактора и демонстрирует полноценную обработку графических данных.
|
||||
BIN
Report/lab2/zivro-lab2-report.pdf
Normal file
BIN
Report/lab2/zivro-lab2-report.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user