爱吃东北冷面 發表於 2026-1-6 14:24:17

Python使用Pillow库批量处理图片的示例详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、准备工作</a></li><li><a href="#_label1">二、基础图片操作</a></li><li><a href="#_label2">三、批量调整图片大小</a></li><li><a href="#_label3">四、添加水印</a></li><li><a href="#_label4">五、高级技巧</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_0">1. 图片格式转换</a></li><li><a href="#_lab2_4_1">2. 图片优化</a></li></ul><li><a href="#_label5">小结</a></li><ul class="second_class_ul"></ul></ul></div><p>大家好,今天要教大家一个超实用的技能 &mdash;&mdash; 使用<strong>Pillow</strong>库来批量处理图片。无论是调整图片大小、添加水印,还是批量格式转换,都能轻松搞定!让我们一起进入图片处理的奇妙世界吧!</p>
<p class="maodian"><a name="_label0"></a></p><h2>一、准备工作</h2>
<p>首先安装Pillow库:</p>
<div class="jb51code"><pre class="brush:bash;">pip install Pillow
</pre></div>
<p>小贴士:Pillow是PIL(Python Imaging Library)的一个分支,但功能更强大、维护更活跃。</p>
<p class="maodian"><a name="_label1"></a></p><h2>二、基础图片操作</h2>
<p>让我们从最基本的图片操作开始:</p>
<div class="jb51code"><pre class="brush:py;">from PIL import Image, ImageDraw, ImageFont
import os

def basic_image_ops(image_path):
    """
    基础图片操作示例
    """
    # 打开图片
    img = Image.open(image_path)
   
    # 获取图片信息
    print(f"图片大小:{img.size}")
    print(f"图片格式:{img.format}")
    print(f"图片模式:{img.mode}")
   
    # 调整大小
    resized_img = img.resize((800, 600))
   
    # 旋转图片
    rotated_img = img.rotate(45, expand=True)
   
    # 裁剪图片
    cropped_img = img.crop((100, 100, 500, 500))# (左, 上, 右, 下)
   
    # 保存处理后的图片
    resized_img.save('resized.jpg')
    rotated_img.save('rotated.jpg')
    cropped_img.save('cropped.jpg')

# 使用示例
basic_image_ops('example.jpg')
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>三、批量调整图片大小</h2>
<p>在电商工作中,经常需要把产品图片统一调整为特定尺寸:</p>
<div class="jb51code"><pre class="brush:py;">def batch_resize_images(input_folder, output_folder, size=(800, 600)):
    """
    批量调整图片大小
    :param input_folder: 输入文件夹路径
    :param output_folder: 输出文件夹路径
    :param size: 目标尺寸(宽,高)
    """
    # 确保输出文件夹存在
    if not os.path.exists(output_folder):
      os.makedirs(output_folder)
   
    # 支持的图片格式
    supported_formats = {'.jpg', '.jpeg', '.png', '.bmp'}
   
    success_count = 0
    fail_count = 0
   
    for filename in os.listdir(input_folder):
      if any(filename.lower().endswith(fmt) for fmt in supported_formats):
            try:
                # 打开图片
                image_path = os.path.join(input_folder, filename)
                img = Image.open(image_path)
               
                # 保持纵横比调整大小
                img.thumbnail(size, Image.Resampling.LANCZOS)
               
                # 保存处理后的图片
                output_path = os.path.join(output_folder, filename)
                img.save(output_path, quality=95)
               
                success_count += 1
                print(f"成功处理:{filename}")
               
            except Exception as e:
                fail_count += 1
                print(f"处理失败 - {filename}: {str(e)}")
   
    print(f"\n处理完成!成功:{success_count},失败:{fail_count}")

# 使用示例
batch_resize_images('input_images', 'output_images', (1024, 768))
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>四、添加水印</h2>
<p>保护图片版权,给图片添加水印:</p>
<div class="jb51code"><pre class="brush:py;">def add_watermark(image_path, watermark_text, output_path):
    """
    给图片添加文字水印
    """
    # 打开图片
    img = Image.open(image_path)
   
    # 创建绘图对象
    draw = ImageDraw.Draw(img)
   
    # 加载字体(请确保字体文件存在)
    try:
      font = ImageFont.truetype('arial.ttf', 36)
    except:
      font = ImageFont.load_default()
   
    # 计算水印位置(右下角)
    text_width = draw.textlength(watermark_text, font=font)
    text_height = 36
    x = img.width - text_width - 20
    y = img.height - text_height - 20
   
    # 添加半透明文字
    draw.text(
      (x, y),
      watermark_text,
      fill=(255, 255, 255, 128),# 白色,半透明
      font=font
    )
   
    # 保存图片
    img.save(output_path)

# 批量添加水印
def batch_add_watermark(input_folder, output_folder, watermark_text):
    """
    批量给图片添加水印
    """
    if not os.path.exists(output_folder):
      os.makedirs(output_folder)
      
    for filename in os.listdir(input_folder):
      if filename.lower().endswith(('.jpg', '.jpeg', '.png')):
            input_path = os.path.join(input_folder, filename)
            output_path = os.path.join(output_folder, f"watermarked_{filename}")
            add_watermark(input_path, watermark_text, output_path)
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>五、高级技巧</h2>
<p class="maodian"><a name="_lab2_4_0"></a></p><h3>1. 图片格式转换</h3>
<div class="jb51code"><pre class="brush:py;">def convert_format(input_path, output_format):
    """
    转换图片格式
    :param input_path: 输入图片路径
    :param output_format: 目标格式(如'PNG')
    """
    img = Image.open(input_path)
   
    # 如果是PNG,保持透明通道
    if output_format.upper() == 'PNG':
      if img.mode in ('RGBA', 'LA'):
            output_path = input_path.rsplit('.', 1) + '.png'
            img.save(output_path, output_format)
            return
   
    # 转换为RGB模式(去除透明通道)
    rgb_img = img.convert('RGB')
    output_path = input_path.rsplit('.', 1) + '.' + output_format.lower()
    rgb_img.save(output_path, output_format)
</pre></div>
<p class="maodian"><a name="_lab2_4_1"></a></p><h3>2. 图片优化</h3>
<div class="jb51code"><pre class="brush:py;">def optimize_image(input_path, output_path, max_size_kb=500):
    """
    优化图片大小,控制在指定KB以内
    """
    img = Image.open(input_path)
    quality = 95
   
    while True:
      img.save(output_path, quality=quality)
      size_kb = os.path.getsize(output_path) / 1024
      
      if size_kb &lt;= max_size_kb or quality &lt;= 5:
            break
            
      quality -= 5

    print(f"优化完成:{size_kb:.2f}KB,质量:{quality}")
</pre></div>
<p><strong>练习小任务</strong></p>
<p>尝试实现以下功能:</p>
<ul><li>给图片添加图片水印</li><li>批量为图片添加边框</li><li>制作图片缩略图画廊</li><li>图片色彩增强</li></ul>
<p><strong>实用技巧</strong>:</p>
<ul><li>处理大量图片时注意内存使用</li><li>保持原图备份</li><li>注意图片质量和文件大小的平衡</li><li>使用多线程提高处理速度</li></ul>
<p class="maodian"><a name="_label5"></a></p><h2>小结</h2>
<p>今天我们学习了:</p>
<ul><li>基础图片操作</li><li>批量调整图片大小</li><li>添加水印</li><li>格式转换和优化</li></ul>
<p>掌握了这些技能,你就能轻松处理各种图片任务了!记住,<strong>实践出真知</strong>,多动手试试不同的参数和效果!</p>
頁: [1]
查看完整版本: Python使用Pillow库批量处理图片的示例详解