Files
labs-information-security/lab6-steganography/cli/parse_args.py
T
2026-07-12 14:06:45 +04:00

148 lines
4.7 KiB
Python

from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
def parse_args(argv=None):
ap = ArgumentParser(
prog="app.py",
description="CLI для лабораторной №6: Стеганография в изображениях",
formatter_class=ArgumentDefaultsHelpFormatter,
)
sub = ap.add_subparsers(dest="cmd", required=True)
# -------- Parent parsers --------
parent_channel_seq = ArgumentParser(add_help=False)
parent_channel_seq.add_argument(
"-c", "--channel",
choices=["Y", "Cb", "Cr", "y", "cb", "cr"],
default="Cb",
help="Канал для встраивания/извлечения: Y, Cb или Cr",
)
parent_channel_seq.add_argument(
"--seq0",
type=str,
default="01010101",
help="8-битная последовательность для бита 0 (seq1 считается инверсией seq0)",
)
parent_gen_common = ArgumentParser(add_help=False)
parent_gen_common.add_argument(
"--size",
type=int,
default=512,
help="Размер стороны квадратного изображения",
)
parent_gen_common.add_argument(
"--channels",
type=int,
choices=[1, 3],
default=3,
help="Количество каналов: 1 (grayscale) или 3 (RGB)",
)
parent_gen_common.add_argument(
"-o", "--output",
required=True,
help="Куда сохранить изображение",
)
# ---------------- EMBED ----------------
sp_embed = sub.add_parser(
"embed",
parents=[parent_channel_seq],
help="Встраивание метки в изображение-контейнер",
formatter_class=ArgumentDefaultsHelpFormatter,
)
sp_embed.add_argument(
"-i", "--input",
required=True,
help="Путь к исходному изображению-контейнеру (512x512, RGB)",
)
sp_embed.add_argument(
"-l", "--label",
required=True,
help="Путь к бинарной метке (64x64)",
)
sp_embed.add_argument(
"-o", "--output",
required=True,
help="Куда сохранить стего-изображение",
)
# ---------------- EXTRACT ----------------
sp_extract = sub.add_parser(
"extract",
parents=[parent_channel_seq],
help="Извлечение метки из стего-изображения",
formatter_class=ArgumentDefaultsHelpFormatter,
)
sp_extract.add_argument(
"-i", "--input",
required=True,
help="Путь к стего-изображению",
)
sp_extract.add_argument(
"-o", "--output",
required=True,
help="Куда сохранить восстановленную бинарную метку (64x64)",
)
# ---------------- ANALYZE ----------------
sp_analyze = sub.add_parser(
"analyze",
help="Сравнение изображений и метрик качества",
formatter_class=ArgumentDefaultsHelpFormatter,
)
sp_analyze.add_argument(
"-a", "--original",
required=True,
help="Путь к исходному изображению-контейнеру",
)
sp_analyze.add_argument(
"-b", "--stego",
required=True,
help="Путь к стего-изображению",
)
sp_analyze.add_argument(
"--space",
choices=["rgb", "ycbcr"],
default="ycbcr",
help="Цветовое пространство для метрик",
)
sp_analyze.add_argument(
"--metrics",
nargs="+",
choices=["psnr"],
default=["psnr"],
help="Набор метрик",
)
# ---------------- GENERATE ----------------
sp_gen = sub.add_parser(
"generate",
help="Генерация изображений",
formatter_class=ArgumentDefaultsHelpFormatter,
)
gen_sub = sp_gen.add_subparsers(dest="gen", required=True)
gen_sub.add_parser(
"gradient",
parents=[parent_gen_common],
help="Сгенерировать градиент",
formatter_class=ArgumentDefaultsHelpFormatter,
)
sp_chess = gen_sub.add_parser(
"chess",
parents=[parent_gen_common],
help="Сгенерировать шахматную доску",
formatter_class=ArgumentDefaultsHelpFormatter,
)
sp_chess.add_argument(
"--tile",
type=int,
default=32,
help="Размер квадрата (должен делить --size)",
)
return ap.parse_args(argv)