| 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")
gen.resize(200, 200).save("thumb.jpg")
gen.generate_sizes([
(100, 100),
(200, 200),
(400, 400)
], output_dir="./thumbs/")
CLI Usage
python thumbnail_gen.py --input photo.jpg --size 200x200 --output thumb.jpg
python thumbnail_gen.py --input photo.jpg --sizes 100x100,200x200,400x400 --output ./thumbs/
python thumbnail_gen.py --input ./photos/ --size 200x200 --output ./thumbs/
python thumbnail_gen.py --input photo.jpg --preset social --output ./thumbs/
python thumbnail_gen.py --input photo.jpg --size 200x200 --crop smart --output thumb.jpg
python thumbnail_gen.py --input photo.jpg --size 200x200 --format webp --output thumb.webp
API Reference
ThumbnailGenerator Class
class ThumbnailGenerator:
def __init__(self)
def load(self, filepath: str) -> 'ThumbnailGenerator'
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'
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'
() ->
() ->
() ->
() ->
() ->
Resize Modes
Fit (Default)
Resize to fit within bounds, maintaining aspect ratio:
gen.resize(200, 200, crop="fit")
Fill
Resize to fill bounds, cropping excess:
gen.resize(200, 200, crop="fill")
Stretch
Resize to exact dimensions (distorts aspect ratio):
gen.resize(200, 200, crop="stretch")
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
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/")
Social Media Preset
gen.apply_preset("social", "./output/")
App Icons Preset
gen.apply_preset("icons", "./output/")
Favicon Preset
gen.apply_preset("favicon", "./output/")
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"
)
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
gen.save("thumb.jpg", quality=95)
gen.save("thumb.jpg", quality=85)
gen.save("thumb.jpg", quality=70)
Output Formats
gen.save("thumb.jpg", format="JPEG")
gen.save("thumb.png", format="PNG")
gen.save("thumb.webp", format="WEBP", quality=80)
Output Structure
result = gen.generate_sizes(
sizes=[(100, 100), (200, 200)],
output_dir="./thumbs/"
)
[
{
"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")
gen.generate_sizes(
sizes=[
(80, 80),
(200, 200),
(400, 400),
(800, 800)
],
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