关于 thumbnail-generator
thumbnail-generator 是用于生成图像缩略图的 Python 库和命令行工具,适合需要多种尺寸或整批处理图片的工作流。它提供多种裁剪方式、预设、格式选择和质量控制。
主要功能
- 01智能裁剪,支持人脸与边缘检测
- 02一次生成多种尺寸
- 03网页、社交媒体、图标和 favicon 预设
- 04批量处理文件夹
- 05支持 JPEG、PNG 和 WebP
- 06调整图像质量
适用场景
- 01生成多种尺寸的商品缩略图
- 02批量制作图库缩略图
- 03制作社交媒体图片版本
- 04导出应用图标和 favicon
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dkyazzentwatwa/ chatgpt-skills --skill thumbnail-generator安装后在 Claude Code 中输入/thumbnail-generator确认已加载。
附带文件scripts/requirements.txtscripts/thumbnail_gen.py
详细介绍
缩略图生成器
通过智能裁剪、多种输出尺寸和批量处理,创建优化后的缩略图。
功能
- 智能裁剪:居中、面部感知或基于边缘检测的裁剪
- 多种尺寸:一次生成多种尺寸的缩略图
- 预设:网页、社交媒体、应用图标预设
- 批量处理:处理整个文件夹
- 质量控制:平衡文件大小与画质
- 格式:输出 JPEG、PNG、WebP
快速开始
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 用法
# 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 参考
ThumbnailGenerator 类
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
调整大小模式
适应(默认)
调整大小以适应边界,同时保持纵横比:
gen.resize(200, 200, crop="fit")
# Result: Image fits within 200x200, may have letterboxing
填充
调整大小以填满边界,裁剪多余部分:
gen.resize(200, 200, crop="fill")
# Result: Exactly 200x200, some content may be cropped
拉伸
调整为精确尺寸(会扭曲纵横比):
gen.resize(200, 200, crop="stretch")
# Result: Exactly 200x200, may be distorted
智能裁剪
自动检测图像中最引人注目的部分:
gen.load("photo.jpg")
gen.crop_smart(200, 200)
gen.save("thumb.jpg")
使用边缘检测查找感兴趣区域。
裁剪位置
# 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")
预设
网页预设
gen.apply_preset("web", "./output/")
# Generates:
# - thumb_small.jpg (150x150)
# - thumb_medium.jpg (300x300)
# - thumb_large.jpg (600x600)
社交媒体预设
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)
应用图标预设
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 预设
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)
多种尺寸
一次生成多种尺寸的缩略图:
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
批量处理
处理整个文件夹:
gen = ThumbnailGenerator()
results = gen.process_folder(
input_dir="./photos/",
output_dir="./thumbnails/",
width=200,
height=200,
recursive=True
)
print(f"Processed {len(results)} images")
画质和格式
画质设置
# 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)
输出格式
# 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)
输出结构
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
}
]
工作流示例
电商产品图片
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"
)
图库缩略图
gen = ThumbnailGenerator()
results = gen.process_folder(
input_dir="./gallery/",
output_dir="./gallery/thumbs/",
width=300,
height=200
)
社交媒体批量处理
gen = ThumbnailGenerator()
for image in Path("./photos/").glob("*.jpg"):
gen.load(str(image))
gen.apply_preset("social", f"./social/{image.stem}/")
依赖项
- pillow>=10.0.0
- numpy>=1.24.0
评论
支持 Markdown