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>大家好,今天要教大家一个超实用的技能 —— 使用<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 <= max_size_kb or quality <= 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]