diff --git a/bin/commands/image.py b/bin/commands/image.py index b02bcbd..5cb4aa9 100644 --- a/bin/commands/image.py +++ b/bin/commands/image.py @@ -187,15 +187,25 @@ def compress_images(files, target_mb, max_width, quality, suffix, dry_run): click.echo(f"Compressed: {img_file} -> {output} ({size_mb:.2f} MB)") +_RATIO_MAP = { + "1:1": "1024x1024", + "4:3": "1024x768", + "3:4": "768x1024", + "16:9": "1280x720", + "9:16": "720x1280", +} + + @image.command("generate") @click.argument("prompt", required=False) @click.option("-f", "--file", type=click.Path(exists=True), help="从文件读取 prompt") -@click.option("-s", "--size", default="2K", type=click.Choice(["1K", "2K"]), help="图片尺寸") +@click.option("-s", "--size", help='图片尺寸 (如 2K, 3K, 4K 或 2304x1728)') +@click.option("-r", "--ratio", type=click.Choice(list(_RATIO_MAP.keys())), help="快捷比例 (1:1, 4:3, 3:4, 16:9, 9:16)") @click.option("-o", "--output", help="保存路径(默认只输出 URL)") @click.option("--no-watermark", is_flag=True, help="不添加豆包水印") @click.option("--b64", is_flag=True, help="使用 b64_json 格式获取图片数据") @handle_errors -def generate_image_cmd(prompt, file, size, output, no_watermark, b64): +def generate_image_cmd(prompt, file, size, ratio, output, no_watermark, b64): """使用豆包/Seedream 模型生成图片。""" from openai import OpenAI @@ -209,6 +219,11 @@ def generate_image_cmd(prompt, file, size, output, no_watermark, b64): click.echo("Error: apikey_ark not set. Run: mytoolkit env set apikey_ark ", err=True) raise click.Abort() + if size and ratio: + click.echo("Warning: --size 和 --ratio 同时指定,--size 优先", err=True) + + resolved_size = size or (ratio and _RATIO_MAP[ratio]) or "2K" + client = OpenAI( base_url="https://ark.cn-beijing.volces.com/api/v3", api_key=api_key, @@ -217,7 +232,7 @@ def generate_image_cmd(prompt, file, size, output, no_watermark, b64): resp = client.images.generate( model="doubao-seedream-5-0-260128", prompt=prompt, - size=size, + size=resolved_size, response_format="b64_json" if b64 else "url", extra_body={"watermark": not no_watermark}, )