关于 image-utils
基于 Pillow 的确定性像素级图像处理技能,适用于缩放、裁剪、合成、格式转换和添加水印等操作;不用于生成式或语义级图像编辑。
主要功能
- 01从 URL、路径、字节或 base64 加载图像
- 02缩放、调整尺寸和裁剪
- 03合成图像并适配画布
- 04转换格式并控制质量
- 05添加水印、边框和留白
- 06调整色彩并优化网页图像
适用场景
- 01为网页交付处理 AI 生成的图像
- 02在 PNG、JPEG 和 WEBP 间转换格式
- 03按目标宽高比裁剪社交媒体图片
- 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) | 应用高斯模糊 | |
| Web | optimize_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