使用PIL/Pillow库进行Python图像处理入门 – wiki基地


Python 图像处理入门:使用 PIL/Pillow 库的完全指南

引言

图像处理在当今数字世界中无处不在,从简单的照片编辑、图像格式转换,到复杂的计算机视觉和机器学习应用,都离不开对图像数据的操作。对于 Python 开发者来说,幸运的是,我们拥有一个功能强大且易于使用的库来处理图像——那就是 PIL (Python Imaging Library) 及其现代维护版本 Pillow

PIL 是 Python 语言中事实上的标准图像处理库,但它已停止维护多年。Pillow 是 PIL 的一个友好分支(fork),完全兼容 PIL 的 API,并增加了对 Python 3 的支持以及许多新功能和改进。因此,当你听到 PIL 时,通常指的是现在活跃开发的 Pillow 库。

本文将作为你使用 Pillow 库进行 Python 图像处理的入门指南。我们将从安装开始,逐步深入到 Pillow 的核心概念、基本操作、图像处理技术以及一些更高级的应用,帮助你快速掌握使用 Python 进行图像处理的基础。

1. 准备工作:安装 Pillow

开始之前,你需要确保你的 Python 环境已经安装了 Pillow 库。安装过程非常简单,只需要使用 Python 的包管理器 pip 即可。

打开你的终端或命令行界面,执行以下命令:

bash
pip install Pillow

如果你使用的是特定的 Python 环境(如 Anaconda 或虚拟环境),请确保在相应的环境中执行此命令。安装完成后,你就可以在 Python 代码中导入并使用 Pillow 了。

Pillow 提供了主要的模块 PIL,所以我们通常通过 from PIL import ... 的方式来导入需要的功能。

2. Pillow 的核心:Image 对象

在 Pillow 中,所有的图像操作都围绕着一个核心概念:Image 对象。当你打开一个图像文件、创建一个新图像或者进行任何图像处理操作时,结果通常都是一个 Image 对象。

Image 对象包含了图像的所有信息,包括:

  • 图像模式 (Mode): 描述像素格式和类型(如 RGB, Grayscale, RGBA 等)。
  • 图像大小 (Size): 图像的宽度和高度(以像素为单位)。
  • 图像格式 (Format): 原始图像文件的格式(如 JPEG, PNG, BMP 等)。
  • 像素数据: 图像本身的像素值。

理解 Image 对象及其属性是使用 Pillow 的关键。

图像模式 (Image Modes)

图像模式定义了像素的组成方式。Pillow 支持多种图像模式,常见的有:

  • 'L' (8-bit pixels, grayscale): 8 位灰度图,每个像素值代表亮度(0-255)。
  • 'RGB' (3×8-bit pixels, true color): 24 位彩色图,每个像素由红(R)、绿(G)、蓝(B)三个 8 位通道组成。
  • 'RGBA' (4×8-bit pixels, true color with alpha): 32 位彩色图,在 RGB 的基础上增加了一个 8 位的 Alpha 通道,用于表示像素的透明度(0-255,0 为完全透明,255 为完全不透明)。
  • 'CMYK' (4×8-bit pixels, color separation): 用于印刷的青(C)、洋红(M)、黄(Y)、黑(K)模式。
  • 'P' (8-bit pixels, using a color palette): 8 位像素,使用颜色调色板,常用于 GIF 和一些老式格式。
  • '1' (1-bit pixels, black and white, stored with 1 pixel per byte): 1 位黑白图,每个像素非黑即白。

了解图像模式对于进行正确的图像操作至关重要,因为某些操作可能只支持特定的模式。例如,直接处理透明度通常需要 RGBA 模式,而某些滤镜可能只适用于灰度图。

坐标系

在 Pillow 中,图像的坐标系以左上角为原点 (0, 0)。X 轴向右延伸,Y 轴向下延伸。当你需要指定像素位置、裁剪区域或绘制形状时,都会使用这个坐标系。

3. 基本图像操作

3.1 打开和显示图像

使用 PIL.Image.open() 函数可以打开各种格式的图像文件。

“`python
from PIL import Image

try:
# 打开一个图像文件
img = Image.open(“example.jpg”) # 替换成你的图片文件路径
print(f”图像格式: {img.format}”)
print(f”图像模式: {img.mode}”)
print(f”图像尺寸: {img.size}”) # 返回 (width, height) 元组

# 显示图像 (这个方法在某些系统上可能无法直接工作,主要用于交互式开发和调试)
img.show()

except FileNotFoundError:
print(“错误:未找到文件 ‘example.jpg’。请确保文件存在且路径正确。”)
except Exception as e:
print(f”打开或处理图像时发生错误: {e}”)

“`

img.show() 方法会尝试使用你系统中默认的图片查看器打开图片。这对于简单的查看和调试非常方便,但在自动化脚本或没有图形界面的服务器环境中可能无法使用。

3.2 保存图像

使用 Image 对象的 save() 方法可以将图像保存到文件。你可以指定保存的格式,Pillow 会根据文件扩展名自动判断,但最好显式指定。

“`python

假设 img 是一个已打开的 Image 对象

保存为 JPEG 格式 (可以指定质量参数,0-100,默认 75)

img.save(“output.jpg”, “JPEG”, quality=90)
print(“图像已保存为 output.jpg”)

保存为 PNG 格式 (支持透明度,无损压缩)

img.save(“output.png”, “PNG”)
print(“图像已保存为 output.png”)

保存为 BMP 格式 (无损,文件较大)

img.save(“output.bmp”, “BMP”)
print(“图像已保存为 output.bmp”)

Pillow 也支持保存为 GIF, TIFF 等多种格式

在某些情况下,你可能需要在使用后关闭图像文件

img.close() # 通常不是必需的,除非你处理大量文件且内存受限

“`

注意: 保存为 JPEG 格式时,如果原图是 RGBA 模式,Alpha 通道信息会丢失,透明区域可能会变成黑色或白色。如果需要保留透明度,应保存为 PNG 格式。

3.3 创建新图像

除了打开现有图像,你也可以使用 Image.new() 函数从头开始创建一个新图像。

“`python

创建一个 200×100 像素的 RGB 模式的红色图像

参数:模式,尺寸(width, height),颜色

red_img = Image.new(‘RGB’, (200, 100), color = ‘red’)
red_img.save(“red_rectangle.png”)
print(“已创建一个红色图像并保存为 red_rectangle.png”)

创建一个 100×100 像素的 L 模式(灰度)的黑色图像

black_img = Image.new(‘L’, (100, 100), color = 0) # 0 表示黑色,255 表示白色
black_img.save(“black_square.png”)
print(“已创建一个黑色图像并保存为 black_square.png”)

创建一个 150×150 像素的 RGBA 模式的半透明蓝色图像

颜色使用 (R, G, B, A) 元组表示

(0, 0, 255, 128) -> 蓝色,Alpha=128 (半透明)

semi_transparent_blue = Image.new(‘RGBA’, (150, 150), color = (0, 0, 255, 128))
semi_transparent_blue.save(“semi_transparent_blue.png”)
print(“已创建一个半透明蓝色图像并保存为 semi_transparent_blue.png”)
“`

4. 图像尺寸和颜色处理

4.1 缩放 (Resizing)

使用 Image 对象的 resize() 方法可以改变图像的尺寸。

“`python

假设 img 是一个已打开的 Image 对象

获取原图尺寸

original_width, original_height = img.size
print(f”原图尺寸: {original_width}x{original_height}”)

缩放到指定尺寸 (例如,缩小到宽度为 400 像素,高度按比例缩放)

计算新的高度以保持纵横比

new_width = 400
new_height = int(original_height * (new_width / original_width))
resized_img = img.resize((new_width, new_height))
print(f”按比例缩放至: {new_width}x{new_height}”)
resized_img.save(“resized_example.jpg”)

缩放到固定尺寸 (可能会改变纵横比)

fixed_size_img = img.resize((300, 200))
print(“缩放到固定尺寸 300×200”)
fixed_size_img.save(“fixed_size_example.jpg”)

resize() 方法可以选择不同的采样滤波器,以获得更好的缩放效果。

常用的滤波器包括 Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, Image.BICUBIC, Image.LANCZOS

例如,使用 LANCZOS 滤波器进行高质量缩放

high_quality_resized_img = img.resize((new_width, new_height), Image.Resampling.LANCZOS) # 注意 Pillow 9.0+ 使用 Image.Resampling
print(“使用 LANCZOS 滤波器缩放”)
high_quality_resized_img.save(“resized_example_lanczos.jpg”)
``
**注意:** 在 Pillow 9.0 及更高版本中,采样滤波器从
Image.FILTER_NAME移到了Image.Resampling.FILTER_NAME`。为了兼容性,示例中使用了新写法。

4.2 裁剪 (Cropping)

使用 Image 对象的 crop() 方法可以从图像中裁剪出一个矩形区域。crop() 方法需要一个四元组 (left, upper, right, lower) 作为参数,表示裁剪区域的左上角和右下角坐标。

“`python

假设 img 是一个已打开的 Image 对象

裁剪出一个区域 (例如,从 (100, 50) 到 (400, 350) 的矩形区域)

坐标是 (左边界X, 上边界Y, 右边界X, 下边界Y)

注意:右边界和下边界是排除的,即裁剪区域包含左边界和上边界的像素,但不包含右边界和下边界的像素

cropped_img = img.crop((100, 50, 400, 350))
print(“图像已裁剪”)
cropped_img.save(“cropped_example.jpg”)

你可以计算居中裁剪的区域

width, height = img.size
crop_width = 300
crop_height = 200
left = (width – crop_width) // 2
top = (height – crop_height) // 2
right = left + crop_width
bottom = top + crop_height
center_cropped_img = img.crop((left, top, right, bottom))
print(f”居中裁剪 {crop_width}x{crop_height}”)
center_cropped_img.save(“center_cropped_example.jpg”)
“`

4.3 旋转和翻转 (Rotating and Flipping)

rotate() 方法用于旋转图像,transpose() 方法用于水平或垂直翻转图像,以及执行 90 度、180 度、270 度的旋转。

“`python

假设 img 是一个已打开的 Image 对象

旋转图像 (例如,旋转 45 度)

expand=True 会扩展画布以包含整个旋转后的图像,避免裁剪

rotated_img = img.rotate(45, expand=True)
print(“图像已旋转 45 度”)
rotated_img.save(“rotated_example.png”) # 旋转后尺寸变化,保存为 PNG 避免质量损失

执行 90 度、180 度、270 度旋转,使用 transpose 方法更高效且不会失真

rotated_90_img = img.transpose(Image.Transpose.ROTATE_90)
print(“图像已旋转 90 度”)
rotated_90_img.save(“rotated_90_example.jpg”)

水平翻转

flipped_horizontal_img = img.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
print(“图像已水平翻转”)
flipped_horizontal_img.save(“flipped_horizontal_example.jpg”)

垂直翻转

flipped_vertical_img = img.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
print(“图像已垂直翻转”)
flipped_vertical_img.save(“flipped_vertical_example.jpg”)
``
**注意:** 在 Pillow 9.0+ 中,翻转和旋转常量从
Image.FLIP_LEFT_RIGHT等变为了Image.Transpose.FLIP_LEFT_RIGHT` 等。

4.4 颜色模式转换 (Color Conversions)

使用 convert() 方法可以在不同的颜色模式之间转换图像。这是非常常用的操作,例如将彩色图像转换为灰度图。

“`python

假设 img 是一个已打开的 Image 对象

转换为灰度图 (L 模式)

gray_img = img.convert(‘L’)
print(“图像已转换为灰度图”)
gray_img.save(“gray_example.jpg”)

如果原图是 L 或其他模式,转换为 RGB 模式

rgb_img = img.convert(‘RGB’)
print(“图像已转换为 RGB 模式”)

注意:从 RGB 转换为 L 再转回 RGB,颜色信息是会丢失的

转换为 RGBA 模式 (如果原图是 RGB,会增加一个完全不透明的 Alpha 通道)

rgba_img = img.convert(‘RGBA’)
print(“图像已转换为 RGBA 模式”)

如果原图是 L 模式,转换为 RGBA 也会增加颜色和 Alpha 通道

转换时,如果原图模式不支持透明度(如 RGB),转换为 RGBA 时 Alpha 通道值默认为 255(完全不透明)。

从 RGBA 转换为 RGB 会丢弃 Alpha 通道。

“`
进行某些图像处理操作(如边缘检测、形态学操作)之前,经常需要将图像转换为灰度图。而处理透明度时,RGBA 模式是必须的。

4.5 调整亮度、对比度、颜色和锐度 (Image Enhancements)

Pillow 的 PIL.ImageEnhance 模块提供了方便的类来调整图像的各种属性。

“`python
from PIL import Image, ImageEnhance

假设 img 是一个已打开的 Image 对象

调整亮度 (Brightness)

enhancer_brightness = ImageEnhance.Brightness(img)
bright_img = enhancer_brightness.enhance(1.5) # 因子大于 1 增加亮度,小于 1 降低亮度
dark_img = enhancer_brightness.enhance(0.5)
print(“已调整图像亮度”)
bright_img.save(“bright_example.jpg”)
dark_img.save(“dark_example.jpg”)

调整对比度 (Contrast)

enhancer_contrast = ImageEnhance.Contrast(img)
high_contrast_img = enhancer_contrast.enhance(2.0) # 因子大于 1 增加对比度
low_contrast_img = enhancer_contrast.enhance(0.7)
print(“已调整图像对比度”)
high_contrast_img.save(“high_contrast_example.jpg”)
low_contrast_img.save(“low_contrast_example.jpg”)

调整颜色饱和度 (Color)

enhancer_color = ImageEnhance.Color(img)
high_color_img = enhancer_color.enhance(1.8) # 因子大于 1 增加饱和度
grayscale_img_enhanced = enhancer_color.enhance(0.0) # 因子为 0 得到灰度图
print(“已调整图像饱和度”)
high_color_img.save(“high_color_example.jpg”)
grayscale_img_enhanced.save(“grayscale_enhanced_example.jpg”) # 注意与 convert(‘L’) 的效果可能略有不同

调整锐度 (Sharpness)

enhancer_sharpness = ImageEnhance.Sharpness(img)
sharp_img = enhancer_sharpness.enhance(3.0) # 因子大于 1 增加锐度
blur_img = enhancer_sharpness.enhance(0.5) # 因子小于 1 降低锐度 (变模糊)
print(“已调整图像锐度”)
sharp_img.save(“sharp_example.jpg”)
blur_img.save(“blur_example.jpg”)
“`

enhance() 方法的参数是一个浮点数因子,通常 1.0 表示原始图像效果。

5. 像素级操作

虽然 Pillow 提供了许多高级函数来操作图像,但在某些情况下,你可能需要访问和修改图像的单个像素值。

5.1 获取像素值

可以使用 getpixel((x, y)) 方法获取指定坐标的像素值。返回值的格式取决于图像的模式。

“`python

假设 img 是一个已打开的 Image 对象

获取图像尺寸

width, height = img.size

获取左上角像素值

try:
pixel_0_0 = img.getpixel((0, 0))
print(f”左上角像素值 (0, 0): {pixel_0_0}”)

# 获取图像中心像素值
center_x = width // 2
center_y = height // 2
pixel_center = img.getpixel((center_x, center_y))
print(f"中心像素值 ({center_x}, {center_y}): {pixel_center}")

# 根据模式解释像素值
if img.mode == 'RGB':
    print(f"  (RGB) 红色分量: {pixel_center[0]}, 绿色: {pixel_center[1]}, 蓝色: {pixel_center[2]}")
elif img.mode == 'L':
    print(f"  (灰度) 亮度: {pixel_center}")
elif img.mode == 'RGBA':
     print(f"  (RGBA) 红色: {pixel_center[0]}, 绿色: {pixel_center[1]}, 蓝色: {pixel_center[2]}, Alpha: {pixel_center[3]}")

except IndexError:
print(“错误:像素坐标超出图像范围。”)
“`

5.2 修改像素值

可以使用 putpixel((x, y), value) 方法设置指定坐标的像素值。值的格式同样取决于图像模式。

注意: 使用循环遍历像素并逐个修改通常效率非常低,特别是对于大图像。对于批量像素修改,Pillow 提供了一些更高效的方法(如 point() 或使用 NumPy 数组),但对于入门,了解 putpixel 是基础。

“`python

假设 img 是一个已打开的 Image 对象

为了演示修改像素,我们先创建一个可修改的图像副本

img_editable = img.copy() # 创建副本,避免修改原图对象

在图像中心画一个 3×3 的红色方块 (如果图像是 RGB 或 RGBA 模式)

if img_editable.mode in [‘RGB’, ‘RGBA’]:
width, height = img_editable.size
center_x = width // 2
center_y = height // 2
red_color = (255, 0, 0) # RGB 红色

# 在中心像素及其周围 1 像素范围内设置颜色
for x in range(center_x - 1, center_x + 2):
    for y in range(center_y - 1, center_y + 2):
        # 检查坐标是否在图像范围内
        if 0 <= x < width and 0 <= y < height:
            img_editable.putpixel((x, y), red_color)

print("已在图像中心绘制一个红色方块")
img_editable.save("pixel_modified_example.png")

elif img_editable.mode == ‘L’:
# 如果是灰度图,将中心区域像素设为白色
width, height = img_editable.size
center_x = width // 2
center_y = height // 2
white_color = 255 # 灰度白色

for x in range(center_x - 2, center_x + 3): # 画一个 5x5 的白色方块
    for y in range(center_y - 2, center_y + 3):
         if 0 <= x < width and 0 <= y < height:
             img_editable.putpixel((x, y), white_color)
print("已在灰度图中心绘制一个白色方块")
img_editable.save("pixel_modified_gray_example.png")

else:
print(f”当前图像模式 ‘{img_editable.mode}’ 不适合简单的像素修改演示。”)

“`

6. 在图像上绘图

Pillow 的 PIL.ImageDraw 模块提供了一系列函数,可以在 Image 对象上绘制图形、文字等。

“`python
from PIL import Image, ImageDraw, ImageFont

假设 img 是一个已打开的 Image 对象

为了绘图,通常需要一个可修改的图像,或者创建一个新的画布

我们在原图副本上进行绘图演示

img_with_drawing = img.copy()

创建一个 Drawing 对象,所有绘图操作都将通过这个对象进行

draw = ImageDraw.Draw(img_with_drawing)

绘制一条直线

参数:起始点和结束点组成的元组列表 [(x1, y1), (x2, y2)], 填充颜色, 线宽

draw.line([(50, 50), (200, 150)], fill=”blue”, width=5)
print(“已绘制一条蓝色直线”)

绘制一个矩形

参数:左上角和右下角坐标组成的元组 [x1, y1, x2, y2], 填充颜色, 边框颜色, 边框线宽

draw.rectangle([250, 50, 400, 150], outline=”green”, width=3)
print(“已绘制一个绿色矩形框”)

绘制一个填充的椭圆 (如果图像是 RGB 或 RGBA 模式)

参数:外接矩形左上角和右下角坐标 [x1, y1, x2, y2], 填充颜色, 边框颜色

if img_with_drawing.mode in [‘RGB’, ‘RGBA’]:
draw.ellipse([50, 200, 200, 300], fill=”yellow”, outline=”red”)
print(“已绘制一个黄色填充的红色边框椭圆”)

在图像上添加文字

需要加载一个字体文件(.ttf 或 .otf)

try:
# 尝试加载一个常见的系统字体,如果找不到,可以使用 PIL 的默认字体
# 这里的字体路径需要根据你的操作系统和字体安装情况进行修改
# 例如在 Windows 上可能是 “arial.ttf”,在 macOS 上可能是 “/Library/Fonts/Arial.ttf”
# 或者使用 Pillow 自带的默认字体 (较小)
# font = ImageFont.load_default()

# 或者尝试加载一个更常见的字体文件路径 (请根据实际情况修改)
font_path = "arial.ttf" # Windows
# font_path = "/Library/Fonts/Arial.ttf" # macOS
# font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf" # Linux (示例)

# 尝试加载字体,如果失败则使用默认字体
try:
    font = ImageFont.truetype(font_path, 30) # 字体大小 30
    print(f"已加载字体: {font_path}")
except IOError:
    print("字体文件未找到或加载失败,使用默认字体。")
    font = ImageFont.load_default()


# 绘制文字
# 参数:文字位置 (左上角), 文本字符串, 填充颜色, 字体对象
text_position = (50, 350)
text_color = (255, 255, 255) # 白色
if img_with_drawing.mode == 'L': # 灰度图用灰度值表示颜色
     text_color = 255

draw.text(text_position, "Hello, Pillow!", fill=text_color, font=font)
print(f"已在位置 {text_position} 添加文字 'Hello, Pillow!'")

except Exception as e:
print(f”绘制文字时发生错误: {e}”)
print(“请确保你的系统中有可用的字体文件,并修改 font_path 变量指向正确的路径。”)

保存绘制后的图像

img_with_drawing.save(“drawing_example.png”) # 保存为 PNG 格式,因为绘制的图形可能有透明或锐利的边缘
“`

绘制操作是在 ImageDraw 对象上进行的,但效果会应用到创建 ImageDraw 对象时关联的 Image 对象上。

7. 滤镜 (Filters)

PIL.ImageFilter 模块提供了一些预定义的图像滤镜,如模糊、锐化、边缘检测等。

“`python
from PIL import Image, ImageFilter

假设 img 是一个已打开的 Image 对象

应用模糊滤镜

blurred_img = img.filter(ImageFilter.BLUR)
print(“已应用模糊滤镜”)
blurred_img.save(“blurred_example.jpg”)

应用边缘检测滤镜

注意:某些滤镜可能只适用于特定模式,例如 FIND_EDGES 通常在灰度图上效果更好

gray_img_for_filter = img.convert(‘L’)
edges_img = gray_img_for_filter.filter(ImageFilter.FIND_EDGES)
print(“已应用边缘检测滤镜”)
edges_img.save(“edges_example.jpg”)

应用锐化滤镜

sharpened_img = img.filter(ImageFilter.SHARPEN)
print(“已应用锐化滤镜”)
sharpened_img.save(“sharpened_example.jpg”)

还有更多滤镜可用,如 EMBOSS, CONTOUR 等

可以查阅 Pillow 文档了解更多 ImageFilter 常量

“`

8. 图像合成 (Pasting Images)

使用 Image 对象的 paste() 方法可以将一个图像粘贴到另一个图像上。

“`python

假设 base_img 是背景图像,overlay_img 是要粘贴的前景图像

try:
# 打开背景图像
base_img = Image.open(“example.jpg”).convert(“RGBA”) # 转换为 RGBA 以支持透明度

# 创建一个小的叠加图像 (例如,一个带有透明区域的 PNG 图标,或者创建一个简单的彩色方块)
# 这里我们创建一个带有透明区域的黄色方块作为示例
overlay_size = (100, 100)
overlay_img = Image.new('RGBA', overlay_size, (255, 255, 0, 128)) # 半透明黄色

# 尝试打开一个实际的带有透明通道的 PNG 图标文件
# 如果有图标文件,可以使用下面的代码代替上面创建方块的代码
# try:
#     overlay_img = Image.open("icon.png").convert("RGBA")
#     # 如果需要调整图标大小以适应,可以先进行缩放
#     overlay_img = overlay_img.resize((50, 50), Image.Resampling.LANCZOS)
# except FileNotFoundError:
#      print("未找到 icon.png 文件,使用生成的半透明黄色方块代替。")


# 计算粘贴位置 (例如,粘贴在右下角)
base_width, base_height = base_img.size
overlay_width, overlay_height = overlay_img.size
paste_x = base_width - overlay_width - 10 # 距离右边 10 像素
paste_y = base_height - overlay_height - 10 # 距离底部 10 像素
paste_position = (paste_x, paste_y)

# 粘贴图像
# 第一个参数是要粘贴的图像
# 第二个参数是粘贴位置 (左上角坐标)
# 第三个参数是可选的 mask(掩码)。对于 RGBA 图像,通常将 overlay_img 本身的 Alpha 通道作为 mask,以实现透明粘贴。
base_img.paste(overlay_img, paste_position, overlay_img)
print(f"已将叠加图像粘贴到位置 {paste_position}")

# 保存合成后的图像
base_img.save("pasted_example.png", "PNG") # 保存为 PNG 以保留透明度

except FileNotFoundError:
print(“错误:请确保 ‘example.jpg’ 文件存在。”)
except Exception as e:
print(f”合成图像时发生错误: {e}”)

``
使用
paste()方法时,如果叠加图像是 RGBA 模式,将叠加图像本身作为mask` 参数传入是非常重要的,这样 Pillow 才会根据 Alpha 通道的值来混合像素,实现透明效果。否则,即使叠加图像是 RGBA 模式,粘贴时也可能只使用 RGB 数据,导致透明度信息丢失。

9. 其他常用功能简述

Pillow 还提供了许多其他有用的功能:

  • 序列图像 (GIF): 可以读取和创建 GIF 等序列图像,访问每一帧。
  • EXIF 数据: 可以读取和修改 JPEG 等图像文件中的 EXIF 元数据(如拍摄日期、相机信息等)。
  • 图像信息: 可以获取图像的调色板、色彩直方图等信息。
  • 几何变换: 除了基本的旋转和翻转,还可以进行仿射变换、透视变换等。
  • 自定义插件: Pillow 的设计是可扩展的,可以编写自己的图像加载或处理插件。

这些功能超出了入门的范畴,但当你需要更高级的图像处理时,可以深入研究 Pillow 的官方文档。

10. 总结与展望

通过本文的学习,你应该已经掌握了使用 Pillow 库进行 Python 图像处理的基础知识和常用操作:

  • 安装 Pillow
  • 理解 Image 对象、模式和坐标系
  • 打开、显示和保存图像
  • 创建新图像
  • 进行图像缩放、裁剪、旋转和翻转
  • 进行颜色模式转换
  • 调整亮度、对比度、颜色和锐度
  • 进行简单的像素级操作
  • 在图像上绘制图形和文字
  • 应用内置滤镜
  • 进行图像合成

Pillow 是一个功能丰富且性能良好的库,几乎可以满足你在 Python 中进行各种图像处理的需求。它是进行图像数据科学、构建图像相关应用程序或自动化图像处理任务的强大工具。

这仅仅是 Pillow 世界的冰山一角。鼓励你继续探索 Pillow 的官方文档,尝试更多高级功能,如直方图操作、通道分离与合并、更复杂的几何变换、各种颜色空间转换等。结合 NumPy 等科学计算库,你还可以实现更高效的像素级操作或复杂的图像算法。

拿起你的 Python 编辑器,导入 Pillow,开始你的图像处理之旅吧!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部