Python零基础入门(八):Pillow图片处理基础
产品说:"把这500张商品图统一改成800x600,加个水印,今天下班前要。"
我打开Photoshop,看了看进度条,默默关掉了。
Python三行代码,两分钟搞定。
一、安装和导入
一行命令:
pip install Pillow
国内慢的话加镜像:
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple Pillow
验证一下:
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.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))
三、调整尺寸和裁剪
resize vs thumbnail
两个都能缩放,但行为不一样:
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()返回新图片。
按比例缩放的工具函数:
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()的参数是(左, 上, 右, 下)四个坐标:
img = Image.open("photo.jpg")# 裁出左上角区域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) # 垂直翻转
五、颜色处理
转灰度、转黑白
img = Image.open("photo.jpg")gray = img.convert("L") # 灰度图bw = img.convert("1") # 黑白二值图rgba = img.convert("RGBA") # 加透明通道
调亮度、对比度、饱和度
用法都一样——创建增强器,调倍数:
from PIL import ImageEnhanceimg = Image.open("photo.jpg")# 亮度(1.0原图,<1暗,>1亮)bright = ImageEnhance.Brightness(img).enhance(1.5)# 对比度contrast = ImageEnhance.Contrast(img).enhance(1.8)# 饱和度(0就是灰度图)saturated = ImageEnhance.Color(img).enhance(2.0)# 锐度sharp = ImageEnhance.Sharpness(img).enhance(2.0)
滤镜效果
from PIL import ImageFilterimg = Image.open("photo.jpg")blurred = img.filter(ImageFilter.BLUR) # 模糊gaussian = img.filter(ImageFilter.GaussianBlur(radius=5)) # 高斯模糊,可调半径contour = img.filter(ImageFilter.CONTOUR) # 轮廓线emboss = img.filter(ImageFilter.EMBOSS) # 浮雕sharpen = img.filter(ImageFilter.SHARPEN) # 锐化
几种滤镜组合起来,能出不少有意思的效果。
小结
上篇搞定了Pillow的基础操作:
- • 打开/保存:
Image.open()和.save() - • 缩放:
resize()强制尺寸,thumbnail()等比缩放 - • 旋转翻转:
rotate()和transpose() - • 颜色:
convert()转模式,ImageEnhance调参数,ImageFilter加滤镜
下篇我们搞点实用的——绘制文字图形、批量处理、做个证件照生成器。👉 点击阅读下篇