thumbnail-generator
Generate thumbnails from images with smart cropping, multiple sizes, and batch processing. Ideal for web galleries, social media, and app icons.
$ インストール
git clone https://github.com/dkyazzentwatwa/chatgpt-skills /tmp/chatgpt-skills && cp -r /tmp/chatgpt-skills/thumbnail-generator ~/.claude/skills/chatgpt-skills// tip: Run this command in your terminal to install the skill
SKILL.md
name: thumbnail-generator description: Generate thumbnails from images with smart cropping, multiple sizes, and batch processing. Ideal for web galleries, social media, and app icons.
Thumbnail Generator
Create optimized thumbnails with smart cropping, multiple output sizes, and batch processing.
Features
- Smart Cropping: Center, face-aware, or edge-detection based
- Multiple Sizes: Generate multiple thumbnail sizes at once
- Presets: Web, social media, app icon presets
- Batch Processing: Process entire folders
- Quality Control: Optimize file size vs quality
- Formats: JPEG, PNG, WebP output
Quick Start
from thumbnail_gen import ThumbnailGenerator
gen = ThumbnailGenerator()
gen.load("photo.jpg")
# Create single thumbnail
gen.resize(200, 200).save("thumb.jpg")
# Create multiple sizes
gen.generate_sizes([
(100, 100),
(200, 200),
(400, 400)
], output_dir="./thumbs/")
CLI Usage
# Single thumbnail
python thumbnail_gen.py --input photo.jpg --size 200x200 --output thumb.jpg
# Multiple sizes
python thumbnail_gen.py --input photo.jpg --sizes 100x100,200x200,400x400 --output ./thumbs/
# Batch process folder
python thumbnail_gen.py --input ./photos/ --size 200x200 --output ./thumbs/
# Use preset
python thumbnail_gen.py --input photo.jpg --preset social --output ./thumbs/
# Smart crop
python thumbnail_gen.py --input photo.jpg --size 200x200 --crop smart --output thumb.jpg
# WebP output
python thumbnail_gen.py --input photo.jpg --size 200x200 --format webp --output thumb.webp
API Reference
ThumbnailGenerator Class
class ThumbnailGenerator:
def __init__(self)
# Loading
def load(self, filepath: str) -> 'ThumbnailGenerator'
# Resizing
def resize(self, width: int, height: int,
crop: str = "fit") -> 'ThumbnailGenerator'
def resize_width(self, width: int) -> 'ThumbnailGenerator'
def resize_height(self, height: int) -> 'ThumbnailGenerator'
# Cropping
def crop_center(self, width: int, height: int) -> 'ThumbnailGenerator'
def crop_smart(self, width: int, height: int) -> 'ThumbnailGenerator'
def crop_position(self, width: int, height: int,
position: str = "center") -> 'ThumbnailGenerator'
# Output
def save(self, output: str, quality: int = 85,
format: str = None) -> str
def to_bytes(self, format: str = "JPEG", quality: int = 85) -> bytes
# Batch operations
def generate_sizes(self, sizes: list, output_dir: str,
prefix: str = None) -> list
def process_folder(self, input_dir: str, output_dir: str,
width: int, height: int, recursive: bool = False) -> list
# Presets
def apply_preset(self, preset: str, output_dir: str) -> list
Resize Modes
Fit (Default)
Resize to fit within bounds, maintaining aspect ratio:
gen.resize(200, 200, crop="fit")
# Result: Image fits within 200x200, may have letterboxing
Fill
Resize to fill bounds, cropping excess:
gen.resize(200, 200, crop="fill")
# Result: Exactly 200x200, some content may be cropped
Stretch
Resize to exact dimensions (distorts aspect ratio):
gen.resize(200, 200, crop="stretch")
# Result: Exactly 200x200, may be distorted
Smart Cropping
Automatically detect the most interesting part of the image:
gen.load("photo.jpg")
gen.crop_smart(200, 200)
gen.save("thumb.jpg")
Uses edge detection to find areas of interest.
Crop Positions
# Predefined positions
gen.crop_position(200, 200, position="center")
gen.crop_position(200, 200, position="top")
gen.crop_position(200, 200, position="bottom")
gen.crop_position(200, 200, position="left")
gen.crop_position(200, 200, position="right")
gen.crop_position(200, 200, position="top-left")
gen.crop_position(200, 200, position="top-right")
gen.crop_position(200, 200, position="bottom-left")
gen.crop_position(200, 200, position="bottom-right")
Presets
Web Preset
gen.apply_preset("web", "./output/")
# Generates:
# - thumb_small.jpg (150x150)
# - thumb_medium.jpg (300x300)
# - thumb_large.jpg (600x600)
Social Media Preset
gen.apply_preset("social", "./output/")
# Generates:
# - instagram_square.jpg (1080x1080)
# - instagram_portrait.jpg (1080x1350)
# - instagram_landscape.jpg (1080x566)
# - twitter.jpg (1200x675)
# - facebook.jpg (1200x630)
# - linkedin.jpg (1200x627)
App Icons Preset
gen.apply_preset("icons", "./output/")
# Generates:
# - icon_16.png (16x16)
# - icon_32.png (32x32)
# - icon_48.png (48x48)
# - icon_64.png (64x64)
# - icon_128.png (128x128)
# - icon_256.png (256x256)
# - icon_512.png (512x512)
Favicon Preset
gen.apply_preset("favicon", "./output/")
# Generates:
# - favicon_16.png (16x16)
# - favicon_32.png (32x32)
# - apple_touch.png (180x180)
# - android_192.png (192x192)
# - android_512.png (512x512)
Multiple Sizes
Generate multiple thumbnail sizes at once:
gen.load("photo.jpg")
files = gen.generate_sizes(
sizes=[(100, 100), (200, 200), (400, 400), (800, 800)],
output_dir="./thumbs/",
prefix="product"
)
# Creates:
# - product_100x100.jpg
# - product_200x200.jpg
# - product_400x400.jpg
# - product_800x800.jpg
Batch Processing
Process entire folders:
gen = ThumbnailGenerator()
results = gen.process_folder(
input_dir="./photos/",
output_dir="./thumbnails/",
width=200,
height=200,
recursive=True
)
print(f"Processed {len(results)} images")
Quality and Format
Quality Settings
# High quality (larger file)
gen.save("thumb.jpg", quality=95)
# Balanced (default)
gen.save("thumb.jpg", quality=85)
# Web optimized (smaller file)
gen.save("thumb.jpg", quality=70)
Output Formats
# JPEG (best for photos)
gen.save("thumb.jpg", format="JPEG")
# PNG (best for graphics/transparency)
gen.save("thumb.png", format="PNG")
# WebP (modern, smaller files)
gen.save("thumb.webp", format="WEBP", quality=80)
Output Structure
result = gen.generate_sizes(
sizes=[(100, 100), (200, 200)],
output_dir="./thumbs/"
)
# Returns:
[
{
"size": "100x100",
"path": "./thumbs/image_100x100.jpg",
"file_size": 5432
},
{
"size": "200x200",
"path": "./thumbs/image_200x200.jpg",
"file_size": 15234
}
]
Example Workflows
E-commerce Product Images
gen = ThumbnailGenerator()
gen.load("product.jpg")
# Generate product thumbnails
gen.generate_sizes(
sizes=[
(80, 80), # Cart thumbnail
(200, 200), # Category listing
(400, 400), # Product page
(800, 800) # Zoom view
],
output_dir="./product_images/",
prefix="sku_12345"
)
Gallery Thumbnails
gen = ThumbnailGenerator()
results = gen.process_folder(
input_dir="./gallery/",
output_dir="./gallery/thumbs/",
width=300,
height=200
)
Social Media Batch
gen = ThumbnailGenerator()
for image in Path("./photos/").glob("*.jpg"):
gen.load(str(image))
gen.apply_preset("social", f"./social/{image.stem}/")
Dependencies
- pillow>=10.0.0
- numpy>=1.24.0
Repository

dkyazzentwatwa
Author
dkyazzentwatwa/chatgpt-skills/thumbnail-generator
1
Stars
0
Forks
Updated1d ago
Added1w ago