简介:本文详细介绍如何使用Python的PIL库批量为图片添加文字水印,包含代码示例、参数调优技巧及性能优化建议,适合开发者快速实现自动化水印处理。
在数字版权保护、品牌宣传等场景中,为图片批量添加文字水印是常见需求。传统手动处理方式效率低下且易出错,而Python的PIL(Pillow)库提供了强大的图像处理能力,可实现自动化批量水印添加。本文将系统讲解如何利用PIL完成这一任务,涵盖从基础实现到性能优化的全流程。
PIL(Python Imaging Library)是Python中最常用的图像处理库之一,其分支Pillow提供了更完善的维护和扩展功能。核心模块包括:
Image:基础图像操作ImageDraw:绘图功能(含文字渲染)ImageFont:字体控制文字水印的实现包含三个关键步骤:
from PIL import Image, ImageDraw, ImageFontimport osdef add_text_watermark(input_path, output_path, text, font_path="arial.ttf", font_size=30,position=(10, 10), color=(255, 255, 255), opacity=128):"""单张图片添加文字水印:param input_path: 输入图片路径:param output_path: 输出图片路径:param text: 水印文字:param font_path: 字体文件路径:param font_size: 字体大小:param position: 文字位置(x,y):param color: 文字颜色(RGB):param opacity: 透明度(0-255)"""# 打开原始图片base_image = Image.open(input_path).convert("RGBA")# 创建透明图层txt = Image.new("RGBA", base_image.size, (255, 255, 255, 0))# 获取字体对象try:font = ImageFont.truetype(font_path, font_size)except IOError:font = ImageFont.load_default()# 创建绘图对象draw = ImageDraw.Draw(txt)# 计算文字宽度(用于居中)text_width, text_height = draw.textsize(text, font=font)# 绘制文字(带透明度)draw.text(((base_image.width - text_width)/2, position[1]),text, font=font, fill=(*color, opacity))# 合并图层watermarked = Image.alpha_composite(base_image, txt)# 转换为RGB模式保存(避免保存为RGBA的额外体积)watermarked = watermarked.convert("RGB")watermarked.save(output_path)
def batch_watermark(input_folder, output_folder, **kwargs):"""批量处理文件夹内所有图片:param input_folder: 输入文件夹:param output_folder: 输出文件夹:param kwargs: 传递给add_text_watermark的参数"""if not os.path.exists(output_folder):os.makedirs(output_folder)for filename in os.listdir(input_folder):if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')):input_path = os.path.join(input_folder, filename)output_path = os.path.join(output_folder, filename)add_text_watermark(input_path, output_path, **kwargs)
concurrent.futures加速批量处理def parallel_batch(input_folder, output_folder, max_workers=4, kwargs):
def process_file(filename):
input_path = os.path.join(input_folder, filename)
output_path = os.path.join(output_folder, filename)
add_text_watermark(input_path, output_path, kwargs)
if not os.path.exists(output_folder):os.makedirs(output_folder)files = [f for f in os.listdir(input_folder)if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))]with ThreadPoolExecutor(max_workers=max_workers) as executor:executor.map(process_file, files)
- **内存管理**:对大图采用分块处理(需结合numpy)- **缓存字体对象**:避免重复加载字体文件### 2. 水印效果增强- **平铺水印**:通过循环在图片上重复绘制文字```pythondef tile_watermark(input_path, output_path, text, step=200, **kwargs):base_image = Image.open(input_path).convert("RGBA")txt = Image.new("RGBA", base_image.size, (255, 255, 255, 0))try:font = ImageFont.truetype(kwargs.get("font_path", "arial.ttf"),kwargs.get("font_size", 30))except:font = ImageFont.load_default()draw = ImageDraw.Draw(txt)for x in range(0, base_image.width, step):for y in range(0, base_image.height, step):draw.text((x, y), text, font=font,fill=(*kwargs.get("color", (255,255,255)),kwargs.get("opacity", 128)))watermarked = Image.alpha_composite(base_image, txt)watermarked.convert("RGB").save(output_path)
ImageDraw的text方法结合矩阵变换
# 使用支持中文的字体文件(如simhei.ttf)font = ImageFont.truetype("simhei.ttf", 40)
def relative_position(image, x_percent, y_percent):width, height = image.sizereturn (int(width * x_percent), int(height * y_percent))
try:# 水印处理代码except Exception as e:print(f"处理失败: {filename}, 错误: {str(e)}")continue
为某电商平台的1000张商品图添加”官方正品”水印,要求:
if __name__ == "__main__":# 配置参数config = {"text": "官方正品","font_path": "simhei.ttf","font_size": 40,"color": (255, 255, 255),"opacity": 150,"position": (0, -20) # 底部上移20像素}# 批量处理batch_watermark(input_folder="input_images",output_folder="output_images",**config)# 或使用并行处理# parallel_batch("input_images", "output_images", max_workers=8, **config)
fonts子文件夹中通过PIL实现批量文字水印添加,可显著提升图像处理效率。本文介绍的方案覆盖了从基础实现到性能优化的各个方面,开发者可根据实际需求进行调整。未来可进一步探索:
掌握这些技术后,开发者能够轻松应对各类图片水印需求,为数字内容保护提供可靠的技术支持。