Python零基础入门(十二):Pillow处理图片
产品说:"把这500张商品图统一改成800x600,加个水印,今天下班前要。"
我打开Photoshop,看了看进度条,默默关掉了。
Python三行代码,两分钟搞定。这就是Pillow——Python生态里最常用的图片处理库。
一、Pillow能干什么
一句话:Photoshop能做的日常操作,Pillow基本都能用代码搞定。
批量改尺寸、加水印、转格式、调亮度对比度、裁剪拼图、画验证码……这些你在工作中大概率会遇到的需求,Pillow全包了。而且它是纯Python库,不依赖OpenCV那些重量级依赖,装上就能用。
具体来说,Pillow常干这些活:
- • 转格式——PNG转JPG、WebP,控制压缩质量
二、安装和导入
一行命令:
pip install Pillow
国内慢的话加镜像:
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple Pillow
装完验证一下,不报错就OK:
python -c "from PIL import Image; print('OK')"
常用模块就这几个,按需导入:
from PIL import Image # 图片基本操作from PIL import ImageDraw # 画文字、图形from PIL import ImageFont # 字体from PIL import ImageFilter # 滤镜from PIL import ImageEnhance # 亮度、对比度、饱和度
三、打开和查看图片
先从最基本的开始——打开一张图片,看看它是什么格式、多大尺寸:
from PIL import Imageimg = Image.open("photo.jpg")print(img.format) # JPEGprint(img.size) # (1920, 1080) 宽x高print(img.mode) # RGBprint(img.width) # 1920print(img.height) # 1080img.show() # 调用系统图片查看器
注意 img.size 返回的是 (宽, 高) ,不是(高, 宽)。这个约定跟OpenCV不一样,踩过坑的人都懂。
保存的时候可以直接转格式,还能控制压缩质量:
# 转格式直接保存img.save("photo.png")img.save("photo.webp")# JPEG控制质量:50体积小,95接近原图img.save("photo_low.jpg", quality=50)img.save("photo_high.jpg", quality=95)
从零创建一张空白图片也很常用——比如做个白色画布再往上面画东西:
# 纯色图片:模式、尺寸、颜色red_img = Image.new("RGB", (800, 600), "red")blue_img = Image.new("RGB", (800, 600), (0, 0, 255))# 透明图片用RGBAtransparent = Image.new("RGBA", (800, 600), (255, 255, 255, 0))
四、缩放和裁剪
两个都能缩放,但行为不一样:
img = Image.open("photo.jpg")# resize:强制拉到指定尺寸,不管宽高比resized = img.resize((800, 600))# thumbnail:等比缩放,结果不会超过指定尺寸img_thumb = Image.open("photo.jpg")img_thumb.thumbnail((400, 400)) # 宽高都不超过400
踩坑点:thumbnail()是原地修改,没有返回值;resize()返回新图片。写成 img = img.thumbnail(...) 就等着调试吧。
按比例缩放的工具函数:
def resize_by_ratio(img, ratio): new_width = int(img.width * ratio) new_height = int(img.height * ratio) return img.resize((new_width, new_height))half_img = resize_by_ratio(img, 0.5)
裁剪用 crop(),参数是 (左, 上, 右, 下) 四个坐标:
# 裁出左上角区域box = (100, 100, 500, 400)cropped = img.crop(box)cropped.save("cropped.jpg")
居中裁成正方形,这个用得很多(比如头像):
def crop_center_square(img): width, height = img.size size = min(width, height) left = (width - size) // 2 top = (height - size) // 2 return img.crop((left, top, left + size, top + size))
五、旋转和翻转
img = Image.open("photo.jpg")# 旋转(逆时针为正方向)rotated_90 = img.rotate(90)rotated_45 = img.rotate(45)# 旋转后画布不够大会被裁掉,加expand=True自动扩展rotated_45 = img.rotate(45, expand=True)# 空白区域填白色rotated_45 = img.rotate(45, fillcolor=(255, 255, 255))# 翻转flipped_h = img.transpose(Image.FLIP_LEFT_RIGHT) # 水平镜像flipped_v = img.transpose(Image.FLIP_TOP_BOTTOM) # 垂直翻转
rotate(45)如果不加 expand=True,图片四角会被裁掉。做验证码旋转增强的时候特别容易忘这个参数。
六、小结
上篇搞定了Pillow的基础操作:
- • 打开/保存:Image.open() 和 .save(),直接转格式、控质量
- • 缩放:resize()强制尺寸,thumbnail()等比缩放
- • 裁剪:crop()传四个坐标 (左, 上, 右, 下)
- • 旋转翻转:rotate() 和 transpose()
👉 下篇我们搞颜色处理、绘制文字图形、批量处理。点击阅读:Python零基础入门(十三):Pillow处理图片进阶