mcpField
I
image-utils

image-utils

github.com/bria-ai创意与媒体74348 次安装1 周前更新
代码仓库

关于 image-utils

基于 Pillow 的确定性像素级图像处理技能,适用于缩放、裁剪、合成、格式转换和添加水印等操作;不用于生成式或语义级图像编辑。

主要功能

  1. 01从 URL、路径、字节或 base64 加载图像
  2. 02缩放、调整尺寸和裁剪
  3. 03合成图像并适配画布
  4. 04转换格式并控制质量
  5. 05添加水印、边框和留白
  6. 06调整色彩并优化网页图像

适用场景

  1. 01为网页交付处理 AI 生成的图像
  2. 02在 PNG、JPEG 和 WEBP 间转换格式
  3. 03按目标宽高比裁剪社交媒体图片
  4. 04批量调整图像尺寸并添加水印

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/bria-ai/bria-skill --skill image-utils

安装后在 Claude Code 中输入/image-utils确认已加载。

附带文件references/code-examples/image_utils.py

详细介绍

图像工具

基于 Pillow 的工具,可执行确定性的像素级图像操作。用于调整大小、裁剪、合成、格式转换、添加水印以及其他常见图像处理任务。

何时使用此技能

  • 对 AI 生成的图像进行后期处理:生成后调整大小、裁剪并针对 Web 优化
  • 格式转换:在 PNG、JPEG 和 WEBP 之间转换,并控制质量
  • 合成:叠加图像,或将主体粘贴到背景上
  • 批量处理:调整为多种尺寸、添加水印
  • Web 优化:压缩并调整大小,以便快速交付
  • 社交媒体准备:裁剪为适合特定平台的宽高比

何时不使用此技能 — 改用 bria-ai

此技能仅处理确定性的像素级操作。对于任何生成式或由 AI 驱动的图像任务,请改用 bria-ai 技能:

  • 根据文本提示词生成图像 → 使用 bria-ai
  • 使用 AI 移除或替换背景 → 使用 bria-ai
  • 使用 AI 编辑图像(局部重绘、移除或添加对象) → 使用 bria-ai
  • 风格迁移或由 AI 驱动的视觉效果 → 使用 bria-ai
  • 使用 AI 创建产品生活方式照片 → 使用 bria-ai
  • 使用 AI 超分辨率放大图像 → 使用 bria-ai

经验法则:如果任务需要创建新的视觉内容或理解图像语义,请使用 bria-ai。如果任务需要转换现有像素(调整大小、裁剪、格式转换、添加水印),请使用此技能。

如果 bria-ai 不可用,请安装:

npx skills add bria-ai/bria-skill

快速参考

操作方法描述
加载load(source)从 URL、路径、字节或 base64 加载
load_from_url(url)从 URL 下载图像
保存save(image, path)自动检测格式并保存
to_bytes(image, format)转换为字节
to_base64(image, format)转换为 base64 字符串
调整大小resize(image, width, height)调整为精确尺寸
scale(image, factor)按比例缩放(0.5 = 一半)
thumbnail(image, size)在指定尺寸内适配并保持宽高比
裁剪crop(image, left, top, right, bottom)裁剪指定区域
crop_center(image, width, height)从中心裁剪
crop_to_aspect(image, ratio)裁剪为指定宽高比
合成paste(bg, fg, position)在指定坐标叠加
composite(bg, fg, mask)Alpha 合成
fit_to_canvas(image, w, h)适配到画布尺寸
边框add_border(image, width, color)添加纯色边框
add_padding(image, padding)添加留白边距
变换rotate(image, angle)按角度旋转
flip_horizontal(image)水平镜像
flip_vertical(image)垂直翻转
水印add_text_watermark(image, text)添加文字叠层
add_image_watermark(image, logo)添加徽标水印
调整adjust_brightness(image, factor)调亮或调暗
adjust_contrast(image, factor)调整对比度
adjust_saturation(image, factor)调整色彩饱和度
blur(image, radius)应用高斯模糊
Weboptimize_for_web(image, max_size)优化以便交付
信息get_info(image)获取尺寸、格式和模式

要求

pip install Pillow requests

基本用法

from image_utils import ImageUtils

# Load from URL
image = ImageUtils.load_from_url("https://example.com/image.jpg")

# Or load from various sources
image = ImageUtils.load("/path/to/image.png")         # File path
image = ImageUtils.load(image_bytes)                  # Bytes
image = ImageUtils.load("data:image/png;base64,...")  # Base64

# Resize and save
resized = ImageUtils.resize(image, width=800, height=600)
ImageUtils.save(resized, "output.webp", quality=90)

# Get image info
info = ImageUtils.get_info(image)
print(f"{info['width']}x{info['height']} {info['mode']}")

调整大小与缩放

# Resize to exact dimensions
resized = ImageUtils.resize(image, width=800, height=600)

# Resize maintaining aspect ratio (fit within bounds)
fitted = ImageUtils.resize(image, width=800, height=600, maintain_aspect=True)

# Resize by width only (height auto-calculated)
resized = ImageUtils.resize(image, width=800)

# Scale by factor
half = ImageUtils.scale(image, 0.5)    # 50% size
double = ImageUtils.scale(image, 2.0)  # 200% size

# Create thumbnail
thumb = ImageUtils.thumbnail(image, (150, 150))

裁剪

# Crop to specific region
cropped = ImageUtils.crop(image, left=100, top=50, right=500, bottom=350)

# Crop from center
center = ImageUtils.crop_center(image, width=400, height=400)

# Crop to aspect ratio (for social media)
square = ImageUtils.crop_to_aspect(image, "1:1")      # Instagram
wide = ImageUtils.crop_to_aspect(image, "16:9")       # YouTube thumbnail
story = ImageUtils.crop_to_aspect(image, "9:16")      # Stories/Reels

# Control crop anchor
top_crop = ImageUtils.crop_to_aspect(image, "16:9", anchor="top")
bottom_crop = ImageUtils.crop_to_aspect(image, "16:9", anchor="bottom")

合成

# Paste foreground onto background
result = ImageUtils.paste(background, foreground, position=(100, 50))

# Alpha composite (foreground must have transparency)
result = ImageUtils.composite(background, foreground)

# Fit image onto canvas with letterboxing
canvas = ImageUtils.fit_to_canvas(
    image,
    width=1200,
    height=800,
    background_color=(255, 255, 255, 255),  # White
    position="center"  # or "top", "bottom"
)

格式转换

# Convert to different formats
png_bytes = ImageUtils.to_bytes(image, "PNG")
jpeg_bytes = ImageUtils.to_bytes(image, "JPEG", quality=85)
webp_bytes = ImageUtils.to_bytes(image, "WEBP", quality=90)

# Get base64 for data URLs
base64_str = ImageUtils.to_base64(image, "PNG")
data_url = ImageUtils.to_base64(image, "PNG", include_data_url=True)
# Returns: "data:image/png;base64,..."

# Save with format auto-detected from extension
ImageUtils.save(image, "output.png")
ImageUtils.save(image, "output.jpg", quality=85)
ImageUtils.save(image, "output.webp", quality=90)

水印

# Text watermark
watermarked = ImageUtils.add_text_watermark(
    image,
    text="© 2024 My Company",
    position="bottom-right",  # bottom-left, top-right, top-left, center
    font_size=24,
    color=(255, 255, 255, 128),  # Semi-transparent white
    margin=20
)

# Logo/image watermark
logo = ImageUtils.load("logo.png")
watermarked = ImageUtils.add_image_watermark(
    image,
    watermark=logo,
    position="bottom-right",
    opacity=0.5,
    scale=0.15,  # 15% of image width
    margin=20
)

调整

# Brightness (1.0 = original, <1 darker, >1 lighter)
bright = ImageUtils.adjust_brightness(image, 1.3)
dark = ImageUtils.adjust_brightness(image, 0.7)

# Contrast (1.0 = original)
high_contrast = ImageUtils.adjust_contrast(image, 1.5)

# Saturation (0 = grayscale, 1.0 = original, >1 more vivid)
vivid = ImageUtils.adjust_saturation(image, 1.3)
grayscale = ImageUtils.adjust_saturation(image, 0)

# Sharpness
sharp = ImageUtils.adjust_sharpness(image, 2.0)

# Blur
blurred = ImageUtils.blur(image, radius=5)

变换

# Rotate (counter-clockwise, degrees)
rotated = ImageUtils.rotate(image, 45)
rotated = ImageUtils.rotate(image, 90, expand=False)  # Don't expand canvas

# Flip
mirrored = ImageUtils.flip_horizontal(image)
flipped = ImageUtils.flip_vertical(image)

边框与留白

# Add solid border
bordered = ImageUtils.add_border(image, width=5, color=(0, 0, 0))

# Add padding (whitespace)
padded = ImageUtils.add_padding(image, padding=20)  # Uniform
padded = ImageUtils.add_padding(image, padding=(10, 20, 10, 20))  # left, top, right, bottom

Web 优化

# Optimize for web delivery
optimized_bytes = ImageUtils.optimize_for_web(
    image,
    max_dimension=1920,  # Resize if larger
    format="WEBP",       # Best compression
    quality=85
)

# Save optimized
with open("optimized.webp", "wb") as f:
    f.write(optimized_bytes)

与 Bria AI 集成

将其与 bria-ai 技能 配合使用,对 AI 生成的图像进行后期处理。使用 Bria 的 API 生成或编辑图像,然后使用 image-utils 调整大小、裁剪、添加水印并进行 Web 优化。

import requests
from image_utils import ImageUtils

# Generate with Bria AI (see bria-ai skill for full API reference)
response = requests.post(
    "https://engine.prod.bria-api.com/v2/image/generate",
    headers={"api_token": BRIA_API_KEY, "Content-Type": "application/json"},
    json={"prompt": "product photo of headphones", "aspect_ratio": "1:1", "sync": True}
)
image_url = response.json()["result"]["image_url"]

# Download and post-process
image = ImageUtils.load_from_url(image_url)

# Create multiple sizes for responsive images
sizes = {
    "large": ImageUtils.resize(image, width=1200),
    "medium": ImageUtils.resize(image, width=600),
    "thumb": ImageUtils.thumbnail(image, (150, 150))
}

# Save all as optimized WebP
for name, img in sizes.items():
    ImageUtils.save(img, f"product_{name}.webp", quality=85)

批量处理示例

from pathlib import Path
from image_utils import ImageUtils

def process_catalog(input_dir, output_dir):
    """Process all images in a directory."""
    output_path = Path(output_dir)
    output_path.mkdir(exist_ok=True)

    for image_file in Path(input_dir).glob("*.{jpg,png,webp}"):
        image = ImageUtils.load(image_file)

        # Crop to square
        square = ImageUtils.crop_to_aspect(image, "1:1")

        # Resize to standard size
        resized = ImageUtils.resize(square, width=800, height=800)

        # Add watermark
        final = ImageUtils.add_text_watermark(resized, "© My Brand")

        # Save optimized
        output_file = output_path / f"{image_file.stem}.webp"
        ImageUtils.save(final, output_file, quality=85)

process_catalog("./raw_images", "./processed")

API 参考

完整实现及文档字符串请参见 image_utils.py。

评论

支持 Markdown