Python批量修图案例怎么编写?

wen python案例 3

本文目录导读:

  1. 基础批量处理 - 调整大小和格式
  2. 批量添加水印
  3. 批量调整图片质量
  4. 批量添加滤镜效果
  5. 批量图片去背景(使用rembg库)
  6. 批量添加文字标签
  7. 完整自动化脚本
  8. 依赖安装
  9. 使用建议

我来分享几个实用的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

使用建议

  1. 性能优化:处理大量图片时使用多线程
  2. 错误处理:添加详细的异常处理和日志记录
  3. 内存管理:及时关闭打开的图片文件
  4. 备份原始文件:处理前创建备份
  5. 测试运行:先用少量图片测试代码

这些示例代码涵盖了常见的批量修图需求,你可以根据具体业务需求进行修改和组合使用。

标签: Python

抱歉,评论功能暂时关闭!