固化水印自动对比色与 alpha70 默认规则
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
"""为 MAOMOMO 配图叠加 45° 平铺半透明水印。
|
||||
|
||||
默认水印:MAOMOMO.COM,白色半透明,45° 对角线平铺。
|
||||
默认水印:MAOMOMO.COM,45° 对角线平铺;自动对比色,浅底黑字、深底白字。
|
||||
|
||||
用法:
|
||||
uv run python scripts/maomomo_tile_watermark.py --input assets --output watermarked_assets
|
||||
@@ -48,14 +48,24 @@ def ensure_pillow() -> Tuple[Any, Any, Any]:
|
||||
|
||||
def parse_color(value: str) -> Tuple[int, int, int]:
|
||||
text = value.strip()
|
||||
if text.lower() == "auto":
|
||||
die("auto color must be resolved after reading each image")
|
||||
if text.startswith("#"):
|
||||
text = text[1:]
|
||||
if len(text) != 6:
|
||||
die("颜色必须是 #RRGGBB,例如 #FFFFFF")
|
||||
die("颜色必须是 auto 或 #RRGGBB,例如 #000000 / #FFFFFF")
|
||||
try:
|
||||
return tuple(int(text[i : i + 2], 16) for i in (0, 2, 4)) # type: ignore[return-value]
|
||||
except ValueError:
|
||||
die("颜色必须是有效十六进制,例如 #FFFFFF")
|
||||
die("颜色必须是有效十六进制,例如 #000000 / #FFFFFF")
|
||||
|
||||
|
||||
def auto_contrast_color(image_path: Path, threshold: float = 150.0) -> Tuple[int, int, int]:
|
||||
Image, _, _ = ensure_pillow()
|
||||
with Image.open(image_path) as src:
|
||||
r, g, b = src.convert("RGB").resize((1, 1)).getpixel((0, 0))
|
||||
luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b
|
||||
return (0, 0, 0) if luminance >= threshold else (255, 255, 255)
|
||||
|
||||
|
||||
def load_font(ImageFont: Any, font_path: Optional[str], font_size: int) -> Any:
|
||||
@@ -173,11 +183,11 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
parser.add_argument("--output", required=True, help="输出图片文件或目录。目录模式会保持相对路径。")
|
||||
parser.add_argument("--text", default="MAOMOMO.COM", help="水印文字,默认 MAOMOMO.COM。")
|
||||
parser.add_argument("--angle", type=float, default=45.0, help="水印旋转角度,默认 45。")
|
||||
parser.add_argument("--alpha", type=int, default=72, help="透明度 0-255,默认 72。")
|
||||
parser.add_argument("--color", default="#FFFFFF", help="水印颜色,默认 #FFFFFF。")
|
||||
parser.add_argument("--font-size", type=int, default=42, help="字体大小,默认 42。")
|
||||
parser.add_argument("--alpha", type=int, default=70, help="透明度 0-255,默认 70。")
|
||||
parser.add_argument("--color", default="auto", help="水印颜色,默认 auto:浅底黑字、深底白字;也可指定 #000000 / #FFFFFF。")
|
||||
parser.add_argument("--font-size", type=int, default=50, help="字体大小,默认 50。")
|
||||
parser.add_argument("--font", default=None, help="可选字体路径。")
|
||||
parser.add_argument("--spacing", type=int, default=120, help="水印间距 / 内边距,默认 120。")
|
||||
parser.add_argument("--spacing", type=int, default=28, help="水印间距 / 内边距,默认 28;目标是每张图至少可见 2 个完整 MAOMOMO.COM。")
|
||||
parser.add_argument("--quality", type=int, default=95, help="JPG/WEBP 输出质量,默认 95。")
|
||||
return parser
|
||||
|
||||
@@ -187,7 +197,6 @@ def main(argv: Optional[Iterable[str]] = None) -> int:
|
||||
args = parser.parse_args(list(argv) if argv is not None else None)
|
||||
input_path = Path(args.input).expanduser().resolve()
|
||||
output_path = Path(args.output).expanduser().resolve()
|
||||
color = parse_color(args.color)
|
||||
images = list(iter_images(input_path))
|
||||
if not images:
|
||||
die(f"没有找到支持的图片:{input_path}")
|
||||
@@ -202,7 +211,7 @@ def main(argv: Optional[Iterable[str]] = None) -> int:
|
||||
text=args.text,
|
||||
angle=args.angle,
|
||||
alpha=args.alpha,
|
||||
color=color,
|
||||
color=auto_contrast_color(image_path) if str(args.color).lower() == "auto" else parse_color(args.color),
|
||||
font_size=args.font_size,
|
||||
font_path=args.font,
|
||||
spacing=args.spacing,
|
||||
|
||||
Reference in New Issue
Block a user