当前位置: 首页 > news >正文

【python】Pillow 快速入门

Pillow 快速入门

文章目录

  • Pillow 快速入门
      • 一、基础准备:安装与环境配置
        • 1. 安装 Pillow
        • 2. 核心概念铺垫
      • 二、入门阶段:基础图像操作
        • 1. 打开与保存图片
        • 2. 转换图像模式
        • 3. 简单格式转换与批量处理
      • 三、核心功能:图像编辑与处理
        • 1. 裁剪(Crop)
        • 2. 缩放(Resize)
        • 3. 旋转与翻转
        • 4. 粘贴与合成(Paste)
      • 四、进阶操作:图像增强与分析
        • 1. 图像增强(ImageEnhance)
        • 2. 像素级操作(手动修改像素)
        • 3. 边缘检测(简单实现)
      • 五、高级应用:与其他工具结合与性能优化
        • 1. 处理透明通道(RGBA 模式)
        • 2. 批量处理与性能优化
        • 3. 与 OpenCV 协作
      • 总结:学习路径

一、基础准备:安装与环境配置

1. 安装 Pillow

Pillow 是 PIL(Python Imaging Library)的替代库(PIL 已停止维护),支持 Python 3.6+。

安装命令:

pip install pillow

验证安装(终端运行):

from PIL import Image
print(Image.__version__)  # 输出版本号即成功
2. 核心概念铺垫
  • 图像模式(Mode):Pillow 中图像的模式决定了像素数据的存储方式,常见模式:•L(灰度)、RGB(红绿蓝彩色)、RGBA(带透明通道的彩色)、CMYK(印刷四色)、1(二值图)等。
  • 图像对象(Image):Pillow 操作的核心对象,通过 Image.open()加载图片后生成。

二、入门阶段:基础图像操作

目标:能完成图片的打开、保存、查看元信息、简单格式转换。

1. 打开与保存图片
from PIL import Image# 打开图片(支持 JPG/PNG/GIF/BMP 等常见格式)
img = Image.open("input.jpg")  # 路径可以是绝对或相对路径# 查看图片信息
print(f"格式: {img.format}")    # 原格式(如 JPEG)
print(f"模式: {img.mode}")      # 模式(如 RGB)
print(f"尺寸: {img.size}")      # (宽度, 高度)
print(f"文件名: {img.filename}")# 原文件名# 保存图片(可指定格式,默认同原格式)
img.save("output.png")         # 保存为 PNG
img.save("output.webp", "WEBP")# 显式指定格式
2. 转换图像模式

不同模式间可互相转换(如 RGB 转灰度):

# RGB 转灰度(L 模式)
gray_img = img.convert("L")
gray_img.save("gray.jpg")# RGBA 转 RGB(去除透明通道)
rgba_img = Image.open("transparent.png")
rgb_img = rgba_img.convert("RGB")
rgb_img.save("no_alpha.jpg")
3. 简单格式转换与批量处理

批量将 JPG 转 PNG:

import osinput_dir = "jpg_images"
output_dir = "png_images"os.makedirs(output_dir, exist_ok=True)for filename in os.listdir(input_dir):if filename.endswith(".jpg"):img = Image.open(os.path.join(input_dir, filename))img.save(os.path.join(output_dir, f"{os.path.splitext(filename)[0]}.png"))

三、核心功能:图像编辑与处理

目标:掌握裁剪、缩放、旋转、翻转等常用操作,理解不同方法的差异。

1. 裁剪(Crop)

通过 crop()方法截取指定区域(参数为左上角和右下角坐标元组 (x0, y0, x1, y1)):

# 原图尺寸 (width=800, height=600)
box = (100, 100, 500, 400)  # 截取中间区域
cropped_img = img.crop(box)
cropped_img.save("cropped.jpg")
2. 缩放(Resize)

使用 resize()调整尺寸,支持多种重采样滤波器(影响清晰度):

# 直接指定目标尺寸(宽度, 高度)
resized_img = img.resize((400, 300))  # 默认双线性滤波(BILINEAR)# 指定滤波器(更清晰或更快)
from PIL import Imagemethods = {"nearest": Image.NEAREST,    # 最近邻(最快,模糊)"bilinear": Image.BILINEAR,  # 双线性(平衡)"bicubic": Image.BICUBIC,    # 双三次(更清晰,慢)"lanczos": Image.LANCZOS     # Lanczos(最高质量,最慢)
}# 使用 Lanczos 滤镜高质量缩放
high_quality_resized = img.resize((400, 300), resample=methods["lanczos"])
high_quality_resized.save("resized_lanczos.jpg")# 快捷方法:thumbnail() 生成缩略图(保持比例,不超过指定尺寸)
img.thumbnail((200, 200))  # 原图会被缩小到最大边 200px,保持比例
img.save("thumbnail.jpg")  # 注意:thumbnail 是原地修改!
3. 旋转与翻转
  • 旋转rotate(angle, expand=True)(角度,是否扩展画布避免裁切)
  • 翻转transpose()transpose_method(如左右/上下翻转)
# 旋转 45 度,扩展画布
rotated_img = img.rotate(45, expand=True)
rotated_img.save("rotated.jpg")# 左右翻转(镜像)
flipped_h = img.transpose(Image.FLIP_LEFT_RIGHT)
flipped_h.save("flipped_h.jpg")# 上下翻转
flipped_v = img.transpose(Image.FLIP_TOP_BOTTOM)
flipped_v.save("flipped_v.jpg")
4. 粘贴与合成(Paste)

将一张图粘贴到另一张图上,支持掩码(Mask)控制透明度:

# 加载背景图和水印图(水印需 RGBA 模式)
background = Image.open("background.jpg").convert("RGBA")
watermark = Image.open("watermark.png").convert("RGBA")# 调整水印大小
watermark = watermark.resize((background.size[0]//2, background.size[1]//2))# 粘贴水印到背景中心(使用水印自身作为掩码,保留透明度)
position = ((background.size[0] - watermark.size[0]) // 2,(background.size[1] - watermark.size[1]) // 2
)
background.paste(watermark, position, watermark)  # 第三个参数是掩码(RGBA 图)
background.save("watermarked_bg.png")

四、进阶操作:图像增强与分析

目标:掌握亮度/对比度调整、色彩校正、边缘检测等高级处理。

1. 图像增强(ImageEnhance)

使用 ImageEnhance模块调整亮度、对比度、饱和度等:

from PIL import ImageEnhance# 亮度调整(factor=1.0 原图,>1 更亮,<1 更暗)
enhancer = ImageEnhance.Brightness(img)
bright_img = enhancer.enhance(1.5)  # 提高 50% 亮度
bright_img.save("bright.jpg")# 对比度调整
enhancer = ImageEnhance.Contrast(img)
contrast_img = enhancer.enhance(2.0)  # 对比度翻倍
contrast_img.save("contrast.jpg")# 饱和度调整(仅 RGB/RGBA 图有效)
enhancer = ImageEnhance.Color(img)
saturated_img = enhancer.enhance(1.8)  # 更鲜艳
saturated_img.save("saturated.jpg")
2. 像素级操作(手动修改像素)

直接访问像素值,实现自定义效果(如反色、灰度变换):

# 反色处理(RGB 取反)
pixels = img.load()  # 获取像素矩阵(可修改)
width, height = img.sizefor x in range(width):for y in range(height):r, g, b = pixels[x, y]  # 假设是 RGB 模式pixels[x, y] = (255 - r, 255 - g, 255 - b)img.save("inverted.jpg")# 灰度变换(自定义公式,如加权平均)
gray_pixels = gray_img.load()
for x in range(width):for y in range(height):gray_value = int(0.299 * r + 0.587 * g + 0.114 * b)  # 标准灰度公式gray_pixels[x, y] = gray_value
3. 边缘检测(简单实现)

通过卷积核检测边缘(如 Sobel 算子):

import numpy as np
from PIL import ImageFilter# 使用 Pillow 内置的边缘检测滤镜(更高效)
edge_img = img.filter(ImageFilter.FIND_EDGES)
edge_img.save("edges.jpg")# 自定义 Sobel 算子(需转换为数组操作)
def sobel_edge_detection(pil_img):img_array = np.array(pil_img.convert("L"))  # 转灰度图数组kernel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])kernel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])# 卷积计算梯度gradient_x = convolve2d(img_array, kernel_x, mode="same")gradient_y = convolve2d(img_array, kernel_y, mode="same")gradient = np.sqrt(gradient_x**2 + gradient_y**2)# 归一化到 0-255edge_array = (gradient / gradient.max() * 255).astype(np.uint8)return Image.fromarray(edge_array)sobel_img = sobel_edge_detection(img)
sobel_img.save("sobel_edges.jpg")

五、高级应用:与其他工具结合与性能优化

目标:解决实际问题(如批量处理、格式兼容、与其他库协作)。

1. 处理透明通道(RGBA 模式)
# 创建带透明度的 PNG
img = Image.new("RGBA", (200, 200), (255, 0, 0, 128))  # 红色,半透明
draw = ImageDraw.Draw(img)
draw.rectangle((50, 50, 150, 150), fill=(0, 255, 0, 200))  # 绿色矩形
img.save("transparent.png")
2. 批量处理与性能优化
  • 生成缩略图集:遍历文件夹,为所有图片生成缩略图。
  • 多线程处理:使用 concurrent.futures加速批量操作。
from concurrent.futures import ThreadPoolExecutordef process_image(input_path):img = Image.open(input_path)img.thumbnail((300, 300))img.save(f"thumbs/{os.path.basename(input_path)}")with ThreadPoolExecutor(max_workers=4) as executor:executor.map(process_image, ["images/" + f for f in os.listdir("images")])
3. 与 OpenCV 协作

Pillow 与 OpenCV 数据格式不同(Pillow 是 RGB,OpenCV 是 BGR),需转换:

import cv2
import numpy as np# Pillow → OpenCV
pil_img = Image.open("input.jpg")
opencv_img = np.array(pil_img)[:, :, ::-1]  # RGB 转 BGR# OpenCV → Pillow
cv2_img = cv2.imread("input.jpg")
pil_img = Image.fromarray(cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB))

总结:学习路径

安装验证→基础操作(开/存/转)→核心编辑(裁/缩/旋/粘)→增强分析(亮度/边缘)→高级协作(跨库/性能)→实战项目→源码贡献。

http://www.dtcms.com/a/516461.html

相关文章:

  • [特殊字符] [特殊字符][特殊字符]这样的 ​Emoji 表情符号​ 是怎么来的、怎么显示出来的,以及它们到底是怎么工作的
  • Salesforce Connected App 创建指南
  • 做的比较好的国外网站一级页面布局分析海外短视频服务器
  • 42.接雨水
  • 衡水网站建设地方网页界面设计案例分析
  • Process Monitor 学习笔记(5.24):工具栏参考与高效快捷键指南
  • UE5 材质-15:车漆-不透明-透明图层,FBX格式的介绍,如何导入外部模型FBX汽车,下载与使用官方的汽车材质 automotive materials,
  • qt实用学习案例:数据库设计+图表显示+model-view模式+样式表定制
  • 脉冲神经网络最新文献合集-XX
  • wordpress做学校网站thinkphp 网站源码
  • 数据库(6)
  • 【性能优化】--perfetto分析思路
  • **发散创新:探索生物神经网络与编程语言的交融**随着生物神经网络研
  • 平台网站开发公司广州安全教育平台登陆
  • 第1章:初识Linux系统——第8节:查看/修改权限控制和ACL
  • Rust所有权机制在Web服务开发中的避坑指南
  • 成都网站开发费用企业网站建设任务书
  • pyhton 螺旋矩阵(指针-矩阵-中等)含源码(二十六)
  • 矩阵的奇异值分解(SVD)在三维图形学中的进阶应用
  • 装饰器加强
  • 17Z一起做网站广州站南阳商都网站做网站
  • MySQL多实例部署实战指南
  • 微网站建设招聘做招聘网站代理商需要多少钱
  • Android 网络变动监听
  • Deep Metric Learning(深度度量学习)
  • 消息队列RabbitMQ、Kafka、ActiveMQ 、Redis、 ZeroMQ、Apache Pulsar对比和如何使用
  • 建网站专用网站标准物质网站建设模板
  • (四)Flutter插件之IOS插件开发
  • 湘潭网站建设 x磐石网络广州网站建设培训学校
  • 织梦做的网站老是被黑国外做美食视频网站有哪些