Pillow 图像基本操作

在安装 Pillow 库后,我们需要导入必要的模块:

# 导入模块
from PIL import Image, ImageFilter, ImageEnhance, ImageDraw, ImageFont
import os

测试图片(下载到本地测试):

实例

以下一个完整的实例,展示了以下操作:

  1. 打开和显示图像基本信息
    • 格式、大小、模式等
  2. 调整图像大小
    • 将图像调整为指定尺寸
  3. 裁剪图像
    • 从原图中提取特定区域
  4. 旋转图像
    • 旋转45度并保留完整图像
  5. 翻转图像
    • 水平和垂直翻转
  6. 转换颜色模式
    • 将彩色图像转换为灰度图
  7. 应用滤镜
    • 模糊、边缘增强、轮廓等效果
  8. 调整图像属性
    • 亮度、对比度和锐度调整
  9. 添加文本
    • 在图像上绘制文字
  10. 合并图像
    • 简单的图像拼接
  11. 保存为不同格式和质量
    • PNG、BMP和不同质量的JPEG

实例

"""
Python Pillow 图像基本操作教程
使用的测试图片: tiger.jpeg
"""


from PIL import Image, ImageFilter, ImageEnhance, ImageDraw, ImageFont
import os

def main():
    # 确保我们的工作目录中有输出文件夹
    output_dir = "output"
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
   
    # 1. 打开图像
    print("1. 打开图像")
    try:
        img = Image.open("tiger.jpeg")
        print(f"成功打开图像 - 格式: {img.format}, 大小: {img.size}, 模式: {img.mode}")
    except Exception as e:
        print(f"无法打开图像: {e}")
        return
   
    # 2. 显示图像基本信息
    print("\n2. 图像基本信息")
    print(f"图像格式: {img.format}")
    print(f"图像大小 (宽x高): {img.size}")
    print(f"图像模式: {img.mode}")
   
    # 3. 调整图像大小
    print("\n3. 调整图像大小")
    resized_img = img.resize((400, 300))
    resized_img.save(f"{output_dir}/resized_tiger.jpg")
    print("已保存调整大小后的图像")
   
    # 4. 裁剪图像
    print("\n4. 裁剪图像")
    # 裁剪区域 (左, 上, 右, 下)
    width, height = img.size
    crop_area = (width//4, height//4, 3*width//4, 3*height//4)  # 裁剪中间区域
    cropped_img = img.crop(crop_area)
    cropped_img.save(f"{output_dir}/cropped_tiger.jpg")
    print(f"已裁剪图像区域 {crop_area} 并保存")
   
    # 5. 旋转图像
    print("\n5. 旋转图像")
    rotated_img = img.rotate(45, expand=True)  # 旋转45度,expand=True 保留整个图像
    rotated_img.save(f"{output_dir}/rotated_tiger.jpg")
    print("已保存旋转后的图像")
   
    # 6. 翻转图像
    print("\n6. 翻转图像")
    # 水平翻转
    h_flipped = img.transpose(Image.FLIP_LEFT_RIGHT)
    h_flipped.save(f"{output_dir}/horizontal_flip_tiger.jpg")
    # 垂直翻转
    v_flipped = img.transpose(Image.FLIP_TOP_BOTTOM)
    v_flipped.save(f"{output_dir}/vertical_flip_tiger.jpg")
    print("已保存水平和垂直翻转的图像")
   
    # 7. 转换颜色模式
    print("\n7. 转换颜色模式")
    grayscale_img = img.convert('L')  # 转换为灰度图
    grayscale_img.save(f"{output_dir}/grayscale_tiger.jpg")
    print("已保存灰度图像")
   
    # 8. 应用滤镜
    print("\n8. 应用滤镜")
    # 模糊滤镜
    blurred_img = img.filter(ImageFilter.BLUR)
    blurred_img.save(f"{output_dir}/blurred_tiger.jpg")
    # 边缘增强
    edge_img = img.filter(ImageFilter.EDGE_ENHANCE)
    edge_img.save(f"{output_dir}/edge_enhanced_tiger.jpg")
    # 轮廓滤镜
    contour_img = img.filter(ImageFilter.CONTOUR)
    contour_img.save(f"{output_dir}/contour_tiger.jpg")
    print("已保存应用不同滤镜的图像")
   
    # 9. 调整亮度、对比度和锐度
    print("\n9. 调整图像属性")
    # 增加亮度
    brightness = ImageEnhance.Brightness(img)
    bright_img = brightness.enhance(1.5)  # 亮度增加50%
    bright_img.save(f"{output_dir}/brighter_tiger.jpg")
   
    # 增加对比度
    contrast = ImageEnhance.Contrast(img)
    contrast_img = contrast.enhance(1.5)  # 对比度增加50%
    contrast_img.save(f"{output_dir}/contrast_tiger.jpg")
   
    # 增加锐度
    sharpness = ImageEnhance.Sharpness(img)
    sharp_img = sharpness.enhance(2.0)  # 锐度增加100%
    sharp_img.save(f"{output_dir}/sharper_tiger.jpg")
    print("已保存亮度、对比度和锐度调整后的图像")
   
    # 10. 添加文字
    print("\n10. 添加文字")
    # 创建一个副本用于绘制
    text_img = img.copy()
    draw = ImageDraw.Draw(text_img)
    # 尝试使用系统字体,如果失败则使用默认
    try:
        # 对于不同操作系统,可能需要不同的字体路径
        # Windows字体路径示例
        font = ImageFont.truetype("arial.ttf", 36)
    except IOError:
        font = ImageFont.load_default()
   
    # 在图像上添加文字
    draw.text((10, 10), "Tiger", fill=(255, 255, 255), font=font)
    text_img.save(f"{output_dir}/text_tiger.jpg")
    print("已保存添加文字的图像")
   
    # 11. 合并图像(简单拼接)
    print("\n11. 合并图像")
    # 创建一个新图像,宽度是原图的两倍,高度相同
    merged_img = Image.new('RGB', (width*2, height))
    # 将原图放在左边
    merged_img.paste(img, (0, 0))
    # 将灰度图放在右边
    merged_img.paste(grayscale_img.convert('RGB'), (width, 0))
    merged_img.save(f"{output_dir}/merged_tiger.jpg")
    print("已保存合并后的图像")
   
    # 12. 保存为不同格式
    print("\n12. 保存为不同格式")
    img.save(f"{output_dir}/tiger.png")  # PNG格式
    img.save(f"{output_dir}/tiger.bmp")  # BMP格式
   
    # 保存为JPEG,设置质量
    img.save(f"{output_dir}/tiger_high_quality.jpg", quality=95)  # 高质量
    img.save(f"{output_dir}/tiger_low_quality.jpg", quality=10)   # 低质量
    print("已保存为不同格式和质量的图像")
   
    print("\n所有操作完成!处理后的图像保存在 'output' 文件夹中。")

if __name__ == "__main__":
    main()

代码采用了结构化的方式,每个操作都有清晰的注释说明。所有处理后的图像会保存在 output 目录下,方便查看和比较效果。

使用方法:

  • 确保在代码所在目录中有 tiger.jpeg 图片
  • 运行代码,将会在 output 文件夹中生成各种处理后的图像
  • 根据输出的信息查看不同处理效果

如果以上代码执行成功,终端输出结果为:


操作说明

1. 打开图像并获取基本信息

实例

# 打开图像文件
img = Image.open("tiger.jpeg")

# 获取和显示图像信息
print(f"图像格式: {img.format}")  # 例如: JPEG, PNG等
print(f"图像大小 (宽x高): {img.size}")  # 例如: (800, 600)
print(f"图像模式: {img.mode}")  # 例如: RGB, RGBA, L(灰度)等

详细说明

  • Image.open() 函数用于打开图像文件,参数是图像文件的路径
  • img.format 显示图像的格式(如JPEG, PNG, GIF等)
  • img.size 返回一个包含宽度和高度的元组,如(800, 600)
  • img.mode 显示图像的颜色模式:
    • RGB: 彩色图像
    • RGBA: 带透明通道的彩色图像
    • L: 灰度图像
    • 1: 二值图像(黑白)

2. 调整图像大小

实例

# 调整图像尺寸为400x300像素
resized_img = img.resize((400, 300))

# 保存调整大小后的图像
resized_img.save("output/resized_tiger.jpg")

详细说明

  • resize() 方法用于改变图像尺寸,参数是一个包含新宽度和高度的元组
  • 这个方法不会修改原始图像,而是返回一个新的图像对象
  • 默认情况下使用最近邻插值法,对于更高质量的调整可以添加参数:resized_img = img.resize((400, 300), Image.LANCZOS)
  • save() 方法将处理后的图像保存到指定路径

3. 裁剪图像

实例

# 获取原图尺寸
width, height = img.size

# 定义裁剪区域 (左, 上, 右, 下)
crop_area = (width//4, height//4, 3*width//4, 3*height//4)  # 裁剪中间区域

# 执行裁剪
cropped_img = img.crop(crop_area)

# 保存裁剪后的图像
cropped_img.save("output/cropped_tiger.jpg")

详细说明

  • crop() 方法用于从图像中提取一个矩形区域
  • 裁剪区域由元组 (left, upper, right, lower) 定义:
    • left: 左边界的x坐标
    • upper: 上边界的y坐标
    • right: 右边界的x坐标
    • lower: 下边界的y坐标
  • 在示例中,我们裁剪了图像的中心部分(1/4到3/4区域)
  • width//4 中的 // 是整数除法,确保结果是整数

4. 旋转图像

实例

# 旋转图像45度,并扩展画布以显示完整图像
rotated_img = img.rotate(45, expand=True)

# 保存旋转后的图像
rotated_img.save("output/rotated_tiger.jpg")

详细说明

  • rotate() 方法用于旋转图像,第一个参数是旋转角度(逆时针,以度为单位)
  • expand=True 参数会扩展输出图像的尺寸,以容纳整个旋转后的图像
  • 如果不设置 expand=True,旋转后的图像会被裁剪以适应原始尺寸
  • 默认情况下,旋转中心是图像的中心点

5. 翻转图像

实例

# 水平翻转(左右镜像)
h_flipped = img.transpose(Image.FLIP_LEFT_RIGHT)
h_flipped.save("output/horizontal_flip_tiger.jpg")

# 垂直翻转(上下镜像)
v_flipped = img.transpose(Image.FLIP_TOP_BOTTOM)
v_flipped.save("output/vertical_flip_tiger.jpg")

详细说明

  • transpose() 方法用于图像的翻转和转置操作
  • Image.FLIP_LEFT_RIGHT 常量表示水平翻转(左右镜像)
  • Image.FLIP_TOP_BOTTOM 常量表示垂直翻转(上下镜像)
  • 除了翻转,还可以使用其他常量如 Image.ROTATE_90, Image.ROTATE_180, Image.ROTATE_270 进行旋转

6. 转换颜色模式

实例

# 将图像转换为灰度图
grayscale_img = img.convert('L')

# 保存灰度图像
grayscale_img.save("output/grayscale_tiger.jpg")

详细说明

  • convert() 方法用于更改图像的模式(颜色空间)
  • 参数 'L' 表示转换为灰度图像(Luminance)
  • 其他常用的模式包括:
    • 'RGB': 三通道彩色
    • 'RGBA': 四通道彩色(带透明度)
    • 'CMYK': 印刷四色模式
    • '1': 二值图像(纯黑白)
  • 转换模式可以减小文件大小或为特定处理做准备

7. 应用图像滤镜

实例

# 应用模糊滤镜
blurred_img = img.filter(ImageFilter.BLUR)
blurred_img.save("output/blurred_tiger.jpg")

# 应用边缘增强滤镜
edge_img = img.filter(ImageFilter.EDGE_ENHANCE)
edge_img.save("output/edge_enhanced_tiger.jpg")

# 应用轮廓滤镜
contour_img = img.filter(ImageFilter.CONTOUR)
contour_img.save("output/contour_tiger.jpg")

详细说明

  • filter() 方法用于对图像应用各种预定义的滤镜效果
  • ImageFilter.BLUR 会使图像模糊,类似于柔焦效果
  • ImageFilter.EDGE_ENHANCE 增强图像的边缘,使轮廓更明显
  • ImageFilter.CONTOUR 寻找图像的轮廓线,产生类似素描的效果
  • 其他常用滤镜还有:
    • ImageFilter.SHARPEN: 锐化图像
    • ImageFilter.EMBOSS: 浮雕效果
    • ImageFilter.FIND_EDGES: 寻找边缘
    • ImageFilter.SMOOTH: 平滑图像
  • 也可以创建自定义滤镜,如高斯模糊: img.filter(ImageFilter.GaussianBlur(radius=2))

8. 调整图像属性(亮度、对比度、锐度)

实例

# 增加亮度(1.5表示亮度增加50%)
brightness = ImageEnhance.Brightness(img)
bright_img = brightness.enhance(1.5)
bright_img.save("output/brighter_tiger.jpg")

# 增加对比度(1.5表示对比度增加50%)
contrast = ImageEnhance.Contrast(img)
contrast_img = contrast.enhance(1.5)
contrast_img.save("output/contrast_tiger.jpg")

# 增加锐度(2.0表示锐度增加100%)
sharpness = ImageEnhance.Sharpness(img)
sharp_img = sharpness.enhance(2.0)
sharp_img.save("output/sharper_tiger.jpg")

详细说明

  • ImageEnhance 模块提供了几种增强器类,用于调整图像的不同属性
  • 每个增强器首先需要用图像对象初始化
  • enhance() 方法接受一个参数,表示增强的程度:
    • 值为1.0表示原始图像不变
    • 值大于1.0表示增强效果(例如1.5表示增加50%)
    • 值小于1.0表示减弱效果(例如0.5表示减少50%)
  • 除了上面展示的三种增强器外,还有 ImageEnhance.Color 用于调整色彩饱和度

9. 添加文字到图像

实例

# 创建一个图像副本用于绘制
text_img = img.copy()

# 创建绘图对象
draw = ImageDraw.Draw(text_img)

# 尝试加载字体(如果不可用则使用默认字体)
try:
    # 加载系统字体,大小为36像素
    font = ImageFont.truetype("arial.ttf", 36)
except IOError:
    # 如果找不到指定字体,使用默认字体
    font = ImageFont.load_default()

# 在图像上添加文字
draw.text((10, 10), "Tiger", fill=(255, 255, 255), font=font)

# 保存添加文字后的图像
text_img.save("output/text_tiger.jpg")

详细说明

  • copy() 方法创建原图像的一个副本,避免修改原始图像
  • ImageDraw.Draw() 创建一个绘图对象,用于在图像上绘制
  • ImageFont.truetype() 用于加载TrueType字体:
    • 第一个参数是字体文件路径(如"arial.ttf")
    • 第二个参数是字体大小(以像素为单位)
  • draw.text() 用于在图像上绘制文字:
    • 第一个参数 (10, 10) 是文字的位置坐标(左上角)
    • 第二个参数是要绘制的文本内容
    • fill 参数指定文字颜色,这里是白色 (255, 255, 255)
    • font 参数指定使用的字体
  • 使用 try-except 块处理可能的字体加载失败情况

10. 合并图像(简单拼接)

实例

# 获取原始图像尺寸
width, height = img.size

# 创建一个新的空白图像,宽度是原图的两倍
merged_img = Image.new('RGB', (width*2, height))

# 将原图粘贴到左侧
merged_img.paste(img, (0, 0))

# 将灰度图转换为RGB并粘贴到右侧
merged_img.paste(grayscale_img.convert('RGB'), (width, 0))

# 保存合并后的图像
merged_img.save("output/merged_tiger.jpg")

详细说明

  • Image.new() 创建一个新的空白图像:
    • 第一个参数是颜色模式,这里是 'RGB'
    • 第二个参数是图像尺寸,这里是原图宽度的两倍和原图高度
  • paste() 方法将一个图像粘贴到另一个图像上:
    • 第一个参数是要粘贴的图像
    • 第二个参数是粘贴位置的坐标 (左上角)
  • convert('RGB') 将灰度图转换为RGB模式,因为只能将相同模式的图像粘贴到一起
  • 这种方法可以用来创建拼贴画、并排比较或创建照片集

11. 保存为不同格式和质量

实例

# 保存为PNG格式(无损压缩)
img.save("output/tiger.png")

# 保存为BMP格式(无压缩)
img.save("output/tiger.bmp")

# 保存为高质量JPEG(质量95%)
img.save("output/tiger_high_quality.jpg", quality=95)

# 保存为低质量JPEG(质量10%)
img.save("output/tiger_low_quality.jpg", quality=10)

详细说明

  • save() 方法根据文件扩展名自动确定保存格式
  • 不同格式的特点:
    • PNG: 无损压缩,支持透明度,适合图标、截图等
    • JPEG: 有损压缩,适合照片,不支持透明度
    • BMP: 无压缩,文件较大,但保留所有信息
    • GIF: 支持动画,最多256色
  • 对于JPEG格式,可以通过 quality 参数控制压缩质量:
    • 值范围从1(最差质量,最小文件)到95(最佳质量,较大文件)
    • 默认值通常为75
  • 不同质量设置可以帮助平衡图像质量和文件大小

12. 创建输出目录

实例

# 确保输出目录存在
output_dir = "output"
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

详细说明

  • os.path.exists() 检查指定的目录是否存在
  • os.makedirs() 创建目录,如果它不存在的话
  • 这段代码确保我们有一个地方保存处理后的图像
  • 把所有生成的图像放在一个单独的目录中,可以更好地组织项目