跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python Pillow 图像处理与格式转换详解

Pillow 库是 Python 生态中最流行的图像处理工具之一,支持超过 30 种格式读写。内容涵盖图像模式转换、几何变换(裁剪缩放旋转)、色彩增强(亮度对比度滤镜)以及图形绘制。通过与 OpenCV 的对比分析,明确其在格式处理和基础操作上的优势,配合完整代码示例,适合需要快速实现图像预处理或 UI 素材生成的开发场景。

黑客帝国发布于 2026/4/9更新于 2026/5/2216 浏览

5.1 Pillow 库概述

5.1.1 Pillow 简介与特点

Pillow 是 Python 图像库(PIL)的现代分支和继承者。PIL 最初由 Fredrik Lundh 于 1995 年开发,曾是 Python 最早的图像处理库之一。由于 PIL 在 2009 年后停止维护,Alex Clark 等人创建了 Pillow 项目,在保持向后兼容的同时持续更新。如今,Pillow 已成为 Python 生态中最流行的图像处理库,每月下载量巨大。

Pillow 的设计理念是简洁易用,提供直观的 API 和丰富的功能。与 OpenCV 相比,Pillow 更专注于图像的基本操作和格式处理,而非复杂的计算机视觉算法。它特别适合以下场景:文件读写、格式转换、基本几何变换(裁剪、缩放、旋转)、增强(滤镜、色彩调整)、绘制(文字、图形)以及元数据处理。

Pillow 支持超过 30 种图像格式,包括常见的 JPEG、PNG、GIF、BMP、TIFF、WebP,以及一些专业格式如 ICO、PPM 等。它对各种格式的读写进行了优化,允许设置压缩参数和质量。对于 GIF 支持动画,PNG 支持透明通道,JPEG 支持渐进式编码。

5.1.2 Pillow 与 OpenCV 的比较

Pillow 和 OpenCV 是 Python 图像处理领域的两大支柱,各有侧重。下表对比了它们的核心特性:

特性PillowOpenCV
主要用途图像处理、格式转换计算机视觉、复杂处理
核心语言Python/CC++
图像表示PIL.Image 对象NumPy 数组
格式支持30+ 种常见格式
学习曲线简单易学相对复杂
性能中等高
深度学习需转换直接支持

实际项目中常结合使用:用 Pillow 做读取和格式转换,用 OpenCV 做复杂算法。两者转换也很方便,Pillow 的 Image 对象可直接转为 NumPy 数组。

5.2 图像读取与写入

5.2.1 基本读写操作

Pillow 提供了简洁的 API 进行图像的读取和写入。Image.open() 用于读取文件,返回 Image 对象;Image.save() 用于保存,可根据扩展名自动识别格式。下面是一个封装好的 IO 类示例,展示了如何批量处理和保存不同格式:

""" Pillow 图像读写操作详解 演示各种图像格式的读取和写入方法 """
from PIL import Image, ExifTags
import numpy as np
import os
import io

class PillowImageIO:
    SUPPORTED_FORMATS = {
        'read': ['JPEG', 'PNG', 'GIF', 'BMP', 'TIFF', 'WebP'],
        'write': ['JPEG', 'PNG', 'GIF', 'BMP', 'TIFF', 'WebP']
    }

    def __init__(self):
        pass

    def open_image(self, file_path: str) -> Image.Image:
        try:
            return Image.open(file_path)
        except Exception as e:
            print(f"无法打开图像:{e}")
            return None

    def save_image(self, image: Image.Image, file_path: str, format=None, **kwargs) -> bool:
        try:
            output_dir = os.path.dirname(file_path)
            if output_dir and not os.path.exists(output_dir):
                os.makedirs(output_dir, exist_ok=True)
            image.save(file_path, format=format, **kwargs)
            return True
        except Exception as e:
            print(f"保存图像失败:{e}")
            return False

    def convert_format(self, input_path: str, output_path: str, output_format=None, **kwargs) -> bool:
        image = self.open_image(input_path)
        if image is None:
            return False
        return self.save_image(image, output_path, format=output_format, **kwargs)

    def batch_convert(self, input_dir: str, output_dir: str, output_format='PNG') -> dict:
        if not os.path.exists(output_dir):
            os.makedirs(output_dir, exist_ok=True)
        results = {'total': 0, 'success': 0, 'failed': 0}
        for filename in os.listdir(input_dir):
            if filename.lower().endswith(('.jpg', '.png', '.bmp')):
                input_file = os.path.join(input_dir, filename)
                stem = os.path.splitext(filename)[0]
                output_file = os.path.join(output_dir, f'{stem}.{output_format.lower()}')
                results['total'] += 1
                if self.convert_format(input_file, output_file):
                    results['success'] += 1
                else:
                    results['failed'] += 1
        return results
5.2.2 图像模式与转换

理解图像模式至关重要,不同的模式对应不同的颜色空间和像素表示。Pillow 支持多种模式,从简单的二值图到复杂的 LAB 空间。

模式说明通道数每像素位数
1二值图像11
L灰度图像18
RGB真彩色324
RGBA带透明通道432
CMYK印刷四色432

下面的代码展示了如何进行模式间的灵活转换,特别是处理透明度和灰度时的注意事项:

from PIL import Image
import numpy as np

class ImageModeConverter:
    def __init__(self, image: Image.Image):
        self.image = image
        self.original_mode = image.mode

    def to_grayscale(self, method='standard') -> Image.Image:
        if method == 'standard':
            return self.image.convert('L')
        rgb = self.image.convert('RGB')
        arr = np.array(rgb, dtype=np.float64)
        # 使用亮度公式计算灰度
        gray = 0.299 * arr[:,:,0] + 0.587 * arr[:,:,1] + 0.114 * arr[:,:,2]
        return Image.fromarray(gray.astype(np.uint8), mode='L')

    def to_rgba(self, background_color=(255, 255, 255)) -> Image.Image:
        if self.image.mode == 'RGBA':
            return self.image.copy()
        # 注意:非 RGBA 转 RGBA 需要指定背景色填充透明通道
        return self.image.convert('RGBA')

    def to_binary(self, threshold=128) -> Image.Image:
        gray = self.image.convert('L')
        return gray.point(lambda x: 255 if x > threshold else 0, mode='1')

5.3 图像基本操作

5.3.1 几何变换

Pillow 提供了丰富的几何变换功能,包括裁剪、缩放、旋转、翻转等。这些操作默认返回新的 Image 对象,不会修改原始数据。在实际应用中,我们常需要根据目标尺寸自适应调整图片。

from PIL import Image, ImageOps

class PillowGeometry:
    def __init__(self, image: Image.Image):
        self.image = image
        self.width, self.height = image.size

    def resize_contain(self, size: tuple, background_color=(255, 255, 255)) -> Image.Image:
        """缩放并包含在指定尺寸内(保持宽高比,不足部分填充)"""
        return ImageOps.fit(self.image, size, method=Image.Resampling.LANCZOS, bleed=0.0, centering=(0.5, 0.5))

    def resize_cover(self, size: tuple) -> Image.Image:
        """缩放并覆盖指定尺寸(保持宽高比,可能裁剪)"""
        ratio = max(size[0] / self.width, size[1] / self.height)
        new_size = (int(self.width * ratio), int(self.height * ratio))
        resized = self.image.resize(new_size, resample=Image.Resampling.LANCZOS)
        left = (resized.width - size[0]) // 2
        upper = (resized.height - size[1]) // 2
        return resized.crop((left, upper, left + size[0], upper + size[1]))

    def create_thumbnail(self, size: tuple) -> Image.Image:
        img_copy = self.image.copy()
        img_copy.thumbnail(size, resample=Image.Resampling.LANCZOS)
        return img_copy
5.3.2 图像增强

通过 ImageEnhance 和 ImageFilter 模块,我们可以轻松调整图像的视觉效果。无论是提升清晰度还是添加艺术滤镜,Pillow 都能胜任。

from PIL import ImageEnhance, ImageFilter

class PillowEnhance:
    def __init__(self, image: Image.Image):
        self.image = image.convert('RGB')

    def adjust_brightness(self, factor: float) -> Image.Image:
        enhancer = ImageEnhance.Brightness(self.image)
        return enhancer.enhance(factor)

    def apply_filter(self, filter_type: str, **kwargs) -> Image.Image:
        filters = {
            'blur': ImageFilter.BLUR,
            'sharpen': ImageFilter.SHARPEN,
            'emboss': ImageFilter.EMBOSS,
            'gaussian': ImageFilter.GaussianBlur(radius=kwargs.get('radius', 2))
        }
        if filter_type in filters:
            return self.image.filter(filters[filter_type])
        return self.image.copy()

5.4 图像绘制与文字处理

5.4.1 图像绘制

ImageDraw 模块允许我们在图像上绘制直线、矩形、圆形、多边形以及文字。这对于生成标注图、水印或简单图表非常有用。

from PIL import ImageDraw, ImageFont

class PillowDrawing:
    def __init__(self, image=None, size=(640, 480), background='white'):
        if image is not None:
            self.image = image.copy()
        else:
            self.image = Image.new('RGB', size, background)
        self.draw = ImageDraw.Draw(self.image)
        self.width, self.height = self.image.size

    def draw_text_centered(self, text: str, color='black', font=None):
        bbox = self.draw.textbbox((0, 0), text, font=font)
        text_width = bbox[2] - bbox[0]
        text_height = bbox[3] - bbox[1]
        x = (self.width - text_width) // 2
        y = (self.height - text_height) // 2
        self.draw.text((x, y), text, fill=color, font=font)

    def draw_arrow(self, start: tuple, end: tuple, color='black', width=2):
        self.draw.line([start, end], fill=color, width=width)
        # 这里可以进一步计算箭头头部顶点绘制多边形

5.5 本章小结

本章详细介绍了 Pillow 库的核心用法,涵盖了从基础的文件读写、格式转换,到进阶的几何变换、色彩增强及绘图功能。Pillow 凭借其简洁的 API 和广泛的格式支持,成为 Python 图像处理的首选工具之一。

虽然 OpenCV 在计算机视觉领域更为强大,但 Pillow 在处理静态图像、UI 素材生成及格式转换方面具有不可替代的优势。两者结合使用往往能发挥最大效能。下一章我们将深入探讨色彩空间转换与通道操作的底层原理。

目录

  1. 5.1 Pillow 库概述
  2. 5.1.1 Pillow 简介与特点
  3. 5.1.2 Pillow 与 OpenCV 的比较
  4. 5.2 图像读取与写入
  5. 5.2.1 基本读写操作
  6. 5.2.2 图像模式与转换
  7. 5.3 图像基本操作
  8. 5.3.1 几何变换
  9. 5.3.2 图像增强
  10. 5.4 图像绘制与文字处理
  11. 5.4.1 图像绘制
  12. 5.5 本章小结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • ComfyUI InstantID 换脸进阶:FaceDetailer + IP-Adapter 工作流
  • macOS 平台 notepad--文本编辑器高效配置指南
  • 二分查找算法详解与模板总结:从原理到变体
  • 本地大模型部署指南:Ollama 安装与 Python 调用
  • w64devkit:Windows C/C++轻量级编译环境搭建指南
  • Whisper-WebUI 语音转文字部署指南与功能解析
  • VS Code + Go 插件配置指南,搭建高效 IDE 开发环境
  • 鸿蒙电商购物车全栈项目:订单管理、支付管理与 AI 原生功能实现
  • Python 环境配置与 pip 安装教程
  • IntelliJ IDEA 常用快捷键指南
  • AI 大模型 API 中转平台选择与接入指南
  • 基于 ESP32-S3 的智能家居键盘 SmartKB32_v2 双模控制器设计
  • TRAE 平台 MCP Server 使用指南:常见问题与解决方案
  • ModelScope 魔搭社区介绍与大模型微调指南
  • 使用 Claude Code 与 GLM4.7 修复前端 Bug 的踩坑实录与反思
  • 阿里云部署 OpenClaw 搭建 24 小时 AI 代理
  • 2026 年主流 AI 大模型实测排名与选型指南
  • llama.cpp Vulkan 后端编译难题解决:环境配置与实战修复
  • AgentScope Java 与 Spring AI Alibaba Workflow 集成指南
  • Java 线程池 ThreadPoolExecutor 入门:原理、核心参数与图解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online