本文目录导读:
我来分享几个实用的Python批量修图案例,从基础操作到复杂处理都有。
基础批量处理 - 调整大小和格式
from PIL import Image
import os
from pathlib import Path
def batch_resize_and_convert(input_folder, output_folder, size=(800, 600), format='JPEG'):
"""
批量调整图片大小并转换格式
"""
# 创建输出文件夹
Path(output_folder).mkdir(parents=True, exist_ok=True)
# 支持的图片格式
valid_extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.tiff'}
# 遍历输入文件夹
for filename in os.listdir(input_folder):
file_path = os.path.join(input_folder, filename)
# 检查是否为图片文件
if os.path.isfile(file_path) and Path(filename).suffix.lower() in valid_extensions:
try:
# 打开图片
with Image.open(file_path) as img:
# 调整大小(保持比例)
img.thumbnail(size, Image.Resampling.LANCZOS)
# 转换模式(JPEG不支持RGBA)
if format.upper() == 'JPEG' and img.mode == 'RGBA':
img = img.convert('RGB')
# 生成输出文件名
output_name = Path(filename).stem + '.' + format.lower()
output_path = os.path.join(output_folder, output_name)
# 保存图片
if format.upper() == 'JPEG':
img.save(output_path, format=format, quality=85)
else:
img.save(output_path, format=format)
print(f"已处理: {filename} -> {output_name}")
except Exception as e:
print(f"处理 {filename} 时出错: {str(e)}")
# 使用示例
batch_resize_and_convert(
input_folder='./原始图片',
output_folder='./处理后图片',
size=(800, 600),
format='JPEG'
)
批量添加水印
from PIL import Image, ImageDraw, ImageFont
import os
def batch_add_watermark(input_folder, output_folder, watermark_text="水印示例",
position='bottom-right', opacity=0.5):
"""
批量添加文字水印
"""
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
image_path = os.path.join(input_folder, filename)
try:
# 打开图片
img = Image.open(image_path).convert('RGBA')
# 创建水印图层
watermark_layer = Image.new('RGBA', img.size, (0, 0, 0, 0))
draw = ImageDraw.Draw(watermark_layer)
# 设置字体大小(根据图片尺寸自适应)
font_size = min(img.width, img.height) // 20
font = ImageFont.truetype("arial.ttf", font_size) if os.name == 'nt' else font_size
# 获取文本尺寸
text_bbox = draw.textbbox((0, 0), watermark_text, font=font)
text_width = text_bbox[2] - text_bbox[0]
text_height = text_bbox[3] - text_bbox[1]
# 计算水印位置
positions = {
'top-left': (10, 10),
'top-right': (img.width - text_width - 10, 10),
'bottom-left': (10, img.height - text_height - 10),
'bottom-right': (img.width - text_width - 10, img.height - text_height - 10),
'center': ((img.width - text_width) // 2, (img.height - text_height) // 2)
}
x, y = positions.get(position, positions['bottom-right'])
# 绘制水印文字
alpha = int(255 * opacity)
draw.text((x, y), watermark_text, fill=(255, 255, 255, alpha), font=font)
# 合并图层
result = Image.alpha_composite(img, watermark_layer)
# 保存结果
output_path = os.path.join(output_folder, filename)
result.convert('RGB').save(output_path, quality=95)
print(f"已处理: {filename}")
except Exception as e:
print(f"处理 {filename} 时出错: {str(e)}")
# 使用示例
batch_add_watermark(
input_folder='./原始图片',
output_folder='./加水印图片',
watermark_text='@我的水印',
position='bottom-right',
opacity=0.4
)
批量调整图片质量
from PIL import Image
import os
import cv2
import numpy as np
def batch_enhance_images(input_folder, output_folder, brightness=1.0,
contrast=1.0, sharpness=1.0, saturation=1.0):
"""
批量优化图片(亮度、对比度、锐度、饱和度)
"""
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
image_path = os.path.join(input_folder, filename)
try:
# 使用OpenCV读取图片
img = cv2.imread(image_path)
if img is None:
print(f"无法读取: {filename}")
continue
# 调整亮度和对比度
adjusted = cv2.convertScaleAbs(img, alpha=contrast, beta=brightness)
# 调整饱和度
if saturation != 1.0:
hsv = cv2.cvtColor(adjusted, cv2.COLOR_BGR2HSV)
hsv[:, :, 1] = cv2.multiply(hsv[:, :, 1], saturation)
adjusted = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
# 调整锐度
if sharpness > 1.0:
kernel = np.array([[-1,-1,-1],
[-1, 9,-1],
[-1,-1,-1]])
adjusted = cv2.filter2D(adjusted, -1, kernel * sharpness)
# 保存结果
output_path = os.path.join(output_folder, filename)
cv2.imwrite(output_path, adjusted)
print(f"已处理: {filename}")
except Exception as e:
print(f"处理 {filename} 时出错: {str(e)}")
# 使用示例
batch_enhance_images(
input_folder='./原始图片',
output_folder='./增强后图片',
brightness=30, # 亮度增加30
contrast=1.2, # 对比度增强1.2倍
sharpness=1.5, # 锐度增强1.5倍
saturation=1.1 # 饱和度增强1.1倍
)
批量添加滤镜效果
from PIL import Image, ImageFilter, ImageEnhance
import os
def batch_apply_filters(input_folder, output_folder, filter_type='blur'):
"""
批量应用滤镜效果
filter_type: 'blur', 'sharpen', 'edge_enhance', 'emboss', 'smooth'
"""
os.makedirs(output_folder, exist_ok=True)
filters = {
'blur': ImageFilter.BLUR,
'sharpen': ImageFilter.SHARPEN,
'edge_enhance': ImageFilter.EDGE_ENHANCE,
'emboss': ImageFilter.EMBOSS,
'smooth': ImageFilter.SMOOTH
}
selected_filter = filters.get(filter_type, ImageFilter.BLUR)
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
image_path = os.path.join(input_folder, filename)
try:
with Image.open(image_path) as img:
# 应用滤镜
filtered_img = img.filter(selected_filter)
# 如果是浮雕效果,增加对比度增强效果
if filter_type == 'emboss':
enhancer = ImageEnhance.Contrast(filtered_img)
filtered_img = enhancer.enhance(2.0)
# 保存结果
output_path = os.path.join(output_folder, filename)
filtered_img.save(output_path)
print(f"已处理: {filename}")
except Exception as e:
print(f"处理 {filename} 时出错: {str(e)}")
# 使用示例
batch_apply_filters(
input_folder='./原始图片',
output_folder='./滤镜图片',
filter_type='sharpen'
)
批量图片去背景(使用rembg库)
from rembg import remove
from PIL import Image
import os
import io
def batch_remove_background(input_folder, output_folder):
"""
批量去除图片背景
需要安装: pip install rembg
"""
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
input_path = os.path.join(input_folder, filename)
try:
# 读取图片
with open(input_path, 'rb') as f:
input_data = f.read()
# 去除背景
output_data = remove(input_data)
# 保存结果
output_path = os.path.join(output_folder, filename.replace('.jpg', '.png').replace('.jpeg', '.png'))
with open(output_path, 'wb') as f:
f.write(output_data)
print(f"已处理: {filename}")
except Exception as e:
print(f"处理 {filename} 时出错: {str(e)}")
# 使用示例
# batch_remove_background('./原始图片', './去背景图片')
批量添加文字标签
from PIL import Image, ImageDraw, ImageFont
import pandas as pd
def batch_add_labels(image_folder, csv_file, output_folder):
"""
根据CSV文件批量添加标签
CSV格式: filename, label, x, y (文本, x坐标, y坐标)
"""
# 读取CSV文件
df = pd.read_csv(csv_file)
os.makedirs(output_folder, exist_ok=True)
for _, row in df.iterrows():
filename = row['filename']
label = row['label']
x = row.get('x', 10)
y = row.get('y', 10)
image_path = os.path.join(image_folder, filename)
if os.path.exists(image_path):
try:
with Image.open(image_path) as img:
draw = ImageDraw.Draw(img)
# 设置字体
font_size = min(img.width, img.height) // 30
try:
font = ImageFont.truetype("arial.ttf", font_size)
except:
font = ImageFont.load_default()
# 添加背景框(可选)
text_bbox = draw.textbbox((x, y), label, font=font)
draw.rectangle(text_bbox, fill='white')
# 添加文字
draw.text((x, y), label, fill='black', font=font)
# 保存
output_path = os.path.join(output_folder, filename)
img.save(output_path)
print(f"已处理: {filename}")
except Exception as e:
print(f"处理 {filename} 时出错: {str(e)}")
# CSV文件示例格式:
# filename, label, x, y
# image1.jpg, 标签1, 50, 100
# image2.jpg, 标签2, 30, 50
完整自动化脚本
import argparse
import os
from pathlib import Path
def main():
parser = argparse.ArgumentParser(description='Python批量图片处理工具')
parser.add_argument('input', help='输入文件夹路径')
parser.add_argument('output', help='输出文件夹路径')
parser.add_argument('--resize', nargs=2, type=int, metavar=('WIDTH', 'HEIGHT'),
help='调整图片大小')
parser.add_argument('--format', choices=['JPEG', 'PNG', 'WEBP'],
default='JPEG', help='输出格式')
parser.add_argument('--quality', type=int, default=85,
help='输出质量 (1-100)')
parser.add_argument('--watermark', type=str, default=None,
help='添加水印文字')
parser.add_argument('--filter', choices=['blur', 'sharpen', 'emboss'],
default=None, help='应用滤镜')
args = parser.parse_args()
# 确保输出目录存在
Path(args.output).mkdir(parents=True, exist_ok=True)
# 处理所有图片
for filename in os.listdir(args.input):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
input_path = os.path.join(args.input, filename)
try:
with Image.open(input_path) as img:
# 调整大小
if args.resize:
img.thumbnail(tuple(args.resize), Image.Resampling.LANCZOS)
# 应用滤镜
if args.filter:
filter_map = {
'blur': ImageFilter.BLUR,
'sharpen': ImageFilter.SHARPEN,
'emboss': ImageFilter.EMBOSS
}
img = img.filter(filter_map[args.filter])
# 添加水印
if args.watermark:
draw = ImageDraw.Draw(img)
font_size = min(img.width, img.height) // 25
font = ImageFont.truetype("arial.ttf", font_size)
# 在右下角添加水印
text_bbox = draw.textbbox((0, 0), args.watermark, font=font)
text_width = text_bbox[2] - text_bbox[0]
text_height = text_bbox[3] - text_bbox[1]
x = img.width - text_width - 10
y = img.height - text_height - 10
draw.text((x, y), args.watermark, fill='white', font=font)
# 保存
output_name = Path(filename).stem + '.' + args.format.lower()
output_path = os.path.join(args.output, output_name)
img.save(output_path, format=args.format, quality=args.quality)
print(f"已处理: {filename} -> {output_name}")
except Exception as e:
print(f"处理 {filename} 时出错: {str(e)}")
if __name__ == "__main__":
main()
依赖安装
# 基础图像处理 pip install Pillow # OpenCV高级处理 pip install opencv-python # 去背景 pip install rembg # 处理和数据分析 pip install pandas
使用建议
- 性能优化:处理大量图片时使用多线程
- 错误处理:添加详细的异常处理和日志记录
- 内存管理:及时关闭打开的图片文件
- 备份原始文件:处理前创建备份
- 测试运行:先用少量图片测试代码
这些示例代码涵盖了常见的批量修图需求,你可以根据具体业务需求进行修改和组合使用。
标签: Python