| name | image-utils |
| description | Classic image manipulation with Python Pillow - resize, crop, composite, format conversion, watermarks, brightness/contrast adjustments, and web optimization. Use this skill when post-processing AI-generated images, preparing images for web delivery, batch processing image directories, creating responsive image variants, or performing any deterministic pixel-level image operation. Works standalone or alongside bria-ai for post-processing generated images. |
| license | MIT |
| metadata | {"author":"Bria AI","version":"1.3.4"} |
Image Utilities
Pillow-based utilities for deterministic pixel-level image operations. Use for resize, crop, composite, format conversion, watermarks, and other standard image processing tasks.
When to Use This Skill
- Post-processing AI-generated images: Resize, crop, optimize for web after generation
- Format conversion: PNG ↔ JPEG ↔ WEBP with quality control
- Compositing: Overlay images, paste subjects onto backgrounds
- Batch processing: Resize to multiple sizes, add watermarks
- Web optimization: Compress and resize for fast delivery
- Social media preparation: Crop to platform-specific aspect ratios
When NOT to Use This Skill — Use bria-ai Instead
This skill handles deterministic pixel-level operations only. For any generative or AI-powered image work, use the bria-ai skill instead:
- Generating images from text prompts → use
bria-ai
- AI background removal or replacement → use
bria-ai
- AI image editing (inpainting, object removal/addition) → use
bria-ai
- Style transfer or AI-driven visual effects → use
bria-ai
- Creating product lifestyle shots with AI → use
bria-ai
- Image upscaling with AI super-resolution → use
bria-ai
Rule of thumb: If the task requires creating new visual content or understanding image semantics, use bria-ai. If the task requires transforming existing pixels (resize, crop, format convert, watermark), use this skill.
If bria-ai is not available, install it with:
npx skills add bria-ai/bria-skill
Quick Reference
| Operation | Method | Description |
|---|
| Loading | load(source) | Load from URL, path, bytes, or base64 |
| load_from_url(url) | Download image from URL |
| Saving | save(image, path) | Save with format auto-detection |
| to_bytes(image, format) | Convert to bytes |
| to_base64(image, format) | Convert to base64 string |
| Resizing | resize(image, width, height) | Resize to exact dimensions |
| scale(image, factor) | Scale by factor (0.5 = half) |
| thumbnail(image, size) | Fit within size, maintain aspect |
| Cropping | crop(image, left, top, right, bottom) | Crop to region |
| crop_center(image, width, height) | Crop from center |
| crop_to_aspect(image, ratio) | Crop to aspect ratio |
| Compositing | paste(bg, fg, position) | Overlay at coordinates |
| composite(bg, fg, mask) | Alpha composite |
| fit_to_canvas(image, w, h) | Fit onto canvas size |
| Borders | add_border(image, width, color) | Add solid border |
| add_padding(image, padding) | Add whitespace padding |
| Transforms | rotate(image, angle) | Rotate by degrees |
| flip_horizontal(image) | Mirror horizontally |
| flip_vertical(image) | Flip vertically |
| Watermarks | add_text_watermark(image, text) | Add text overlay |
| add_image_watermark(image, logo) | Add logo watermark |
| Adjustments | adjust_brightness(image, factor) | Lighten/darken |
| adjust_contrast(image, factor) | Adjust contrast |
| adjust_saturation(image, factor) | Adjust color saturation |
| blur(image, radius) | Apply Gaussian blur |
| Web | optimize_for_web(image, max_size) | Optimize for delivery |
| Info | get_info(image) | Get dimensions, format, mode |
Requirements
pip install Pillow requests
Basic Usage
from image_utils import ImageUtils
image = ImageUtils.load_from_url("https://example.com/image.jpg")
image = ImageUtils.load("/path/to/image.png")
image = ImageUtils.load(image_bytes)
image = ImageUtils.load("data:image/png;base64,...")
resized = ImageUtils.resize(image, width=800, height=600)
ImageUtils.save(resized, "output.webp", quality=90)
info = ImageUtils.get_info(image)
print(f"{info['width']}x{info['height']} {info['mode']}")
Resizing & Scaling
resized = ImageUtils.resize(image, width=800, height=600)
fitted = ImageUtils.resize(image, width=800, height=600, maintain_aspect=True)
resized = ImageUtils.resize(image, width=800)
half = ImageUtils.scale(image, 0.5)
double = ImageUtils.scale(image, 2.0)
thumb = ImageUtils.thumbnail(image, (150, 150))
Cropping
cropped = ImageUtils.crop(image, left=100, top=50, right=500, bottom=350)
center = ImageUtils.crop_center(image, width=400, height=400)
square = ImageUtils.crop_to_aspect(image, "1:1")
wide = ImageUtils.crop_to_aspect(image, "16:9")
story = ImageUtils.crop_to_aspect(image, "9:16")
top_crop = ImageUtils.crop_to_aspect(image, "16:9", anchor="top")
bottom_crop = ImageUtils.crop_to_aspect(image, "16:9", anchor="bottom")
Compositing
result = ImageUtils.paste(background, foreground, position=(100, 50))
result = ImageUtils.composite(background, foreground)
canvas = ImageUtils.fit_to_canvas(
image,
width=1200,
height=800,
background_color=(255, 255, 255, 255),
position="center"
)
Format Conversion
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)
base64_str = ImageUtils.to_base64(image, "PNG")
data_url = ImageUtils.to_base64(image, "PNG", include_data_url=True)
ImageUtils.save(image, "output.png")
ImageUtils.save(image, "output.jpg", quality=85)
ImageUtils.save(image, "output.webp", quality=90)
Watermarks
watermarked = ImageUtils.add_text_watermark(
image,
text="© 2024 My Company",
position="bottom-right",
font_size=24,
color=(255, 255, 255, 128),
margin=20
)
logo = ImageUtils.load("logo.png")
watermarked = ImageUtils.add_image_watermark(
image,
watermark=logo,
position="bottom-right",
opacity=0.5,
scale=0.15,
margin=20
)
Adjustments
bright = ImageUtils.adjust_brightness(image, 1.3)
dark = ImageUtils.adjust_brightness(image, 0.7)
high_contrast = ImageUtils.adjust_contrast(image, 1.5)
vivid = ImageUtils.adjust_saturation(image, 1.3)
grayscale = ImageUtils.adjust_saturation(image, 0)
sharp = ImageUtils.adjust_sharpness(image, 2.0)
blurred = ImageUtils.blur(image, radius=5)
Transforms
rotated = ImageUtils.rotate(image, 45)
rotated = ImageUtils.rotate(image, 90, expand=False)
mirrored = ImageUtils.flip_horizontal(image)
flipped = ImageUtils.flip_vertical(image)
Borders & Padding
bordered = ImageUtils.add_border(image, width=5, color=(0, 0, 0))
padded = ImageUtils.add_padding(image, padding=20)
padded = ImageUtils.add_padding(image, padding=(10, 20, 10, 20))
Web Optimization
optimized_bytes = ImageUtils.optimize_for_web(
image,
max_dimension=1920,
format="WEBP",
quality=85
)
with open("optimized.webp", "wb") as f:
f.write(optimized_bytes)
Integration with Bria AI
Use alongside the bria-ai skill to post-process AI-generated images. Generate or edit images with Bria's API, then use image-utils for resizing, cropping, watermarking, and web optimization.
import requests
from image_utils import ImageUtils
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"]
image = ImageUtils.load_from_url(image_url)
sizes = {
"large": ImageUtils.resize(image, width=1200),
"medium": ImageUtils.resize(image, width=600),
"thumb": ImageUtils.thumbnail(image, (150, 150))
}
for name, img in sizes.items():
ImageUtils.save(img, f"product_{name}.webp", quality=85)
Batch Processing Example
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)
square = ImageUtils.crop_to_aspect(image, "1:1")
resized = ImageUtils.resize(square, width=800, height=800)
final = ImageUtils.add_text_watermark(resized, "© My Brand")
output_file = output_path / f"{image_file.stem}.webp"
ImageUtils.save(final, output_file, quality=85)
process_catalog("./raw_images", "./processed")
API Reference
See image_utils.py for complete implementation with docstrings.