| 146 | # ── 参数定义 ─────────────────────────────────────────────────────────── |
| 147 | |
| 148 | def build_parser() -> argparse.ArgumentParser: |
| 149 | parser = argparse.ArgumentParser( |
| 150 | prog='python cli.py', |
| 151 | description='StegaPy — 图像隐写与数字水印命令行工具', |
| 152 | ) |
| 153 | sub = parser.add_subparsers(dest='command', required=True) |
| 154 | |
| 155 | # embed |
| 156 | p_embed = sub.add_parser('embed', help='将秘密信息嵌入载体图像') |
| 157 | p_embed.add_argument('-i', '--input', required=True, metavar='cover.png', help='载体图像路径') |
| 158 | p_embed.add_argument('-m', '--message', required=True, metavar='msg.txt', help='待嵌入文件路径') |
| 159 | p_embed.add_argument('-o', '--output', required=True, metavar='stego.png', help='输出隐写图像路径') |
| 160 | p_embed.add_argument('-p', '--password', default=None, metavar='密码', help='启用 AES 加密时的密码') |
| 161 | p_embed.add_argument('--algo', choices=['lsb', 'randlsb'], default='lsb', help='隐写算法(默认 lsb)') |
| 162 | p_embed.add_argument('--bits', type=int, default=1, choices=range(1, 9), help='每通道使用位数(默认 1)') |
| 163 | p_embed.add_argument('--no-compress', action='store_true', help='禁用 gzip 压缩') |
| 164 | |
| 165 | # extract |
| 166 | p_extract = sub.add_parser('extract', help='从隐写图像中提取信息') |
| 167 | p_extract.add_argument('-i', '--input', required=True, metavar='stego.png', help='隐写图像路径') |
| 168 | p_extract.add_argument('-o', '--output', default=None, metavar='输出目录', help='提取文件保存目录(默认与输入同目录)') |
| 169 | p_extract.add_argument('-p', '--password', default=None, metavar='密码', help='解密密码(如嵌入时设置了密码)') |
| 170 | p_extract.add_argument('--algo', choices=['lsb', 'randlsb'], default='lsb', help='嵌入时使用的算法(默认 lsb)') |
| 171 | |
| 172 | # wm |
| 173 | p_wm = sub.add_parser('wm', help='数字水印操作') |
| 174 | wm_sub = p_wm.add_subparsers(dest='wm_command', required=True) |
| 175 | |
| 176 | p_wm_embed = wm_sub.add_parser('embed', help='嵌入数字水印') |
| 177 | p_wm_embed.add_argument('-i', '--input', required=True, metavar='cover.png', help='载体图像路径') |
| 178 | p_wm_embed.add_argument('-s', '--sig', required=True, metavar='sig.bin', help='水印签名文件路径') |
| 179 | p_wm_embed.add_argument('-o', '--output', required=True, metavar='stego.png', help='输出图像路径') |
| 180 | p_wm_embed.add_argument('-p', '--password', required=True, metavar='密码', help='水印密码') |
| 181 | |
| 182 | p_wm_verify = wm_sub.add_parser('verify', help='验证数字水印') |
| 183 | p_wm_verify.add_argument('-i', '--input', required=True, metavar='stego.png', help='待验证图像路径') |
| 184 | p_wm_verify.add_argument('-s', '--sig', required=True, metavar='sig.bin', help='原始签名文件路径') |
| 185 | p_wm_verify.add_argument('-p', '--password', required=True, metavar='密码', help='水印密码') |
| 186 | |
| 187 | p_wm_gensig = wm_sub.add_parser('generate-sig', help='生成水印签名') |
| 188 | p_wm_gensig.add_argument('-o', '--output', required=True, metavar='sig.bin', help='签名输出路径') |
| 189 | p_wm_gensig.add_argument('-p', '--password', required=True, metavar='密码', help='水印密码') |
| 190 | |
| 191 | return parser |
| 192 | |
| 193 | |
| 194 | def main(): |