Python 图像处理之PIL库详解用法

Python 图像处理之PIL库详解用法

PIL库简介

Python Imaging Library(PIL)是Python的第三方模块,用于图像处理相关的应用。

安装PIL库

PIL版本更新较慢,建议直接安装Pillow,Pillow是PIL的一个分支项目,它基本保留了PIL的所有功能,并在此基础上提供了一些新的功能以及增强。

可以通过pip安装Pillow:

pip install Pillow

PIL库常用函数

打开和保存图像

打开图像

Image.open(fp, mode='r'):打开图像文件,返回一个图像对象。参数fp指定文件或文件的路径,参数mode可以指定打开模式,默认为'r',只读模式。

from PIL import Image

image = Image.open('/path/to/image.jpg')

保存图像

Image.save(fp, format=None, **params):将图像保存到文件或文件流中。参数fp指定文件名和路径,参数format指定文件格式,可以是JPEG、PNG、GIF等格式。另外,还可以使用关键字参数params指定保存参数,比如图片质量等。

from PIL import Image

image = Image.open('/path/to/image.jpg')
image.save('/path/to/save.jpg', format='JPEG', quality=90)

图像缩放、裁剪和旋转

图像缩放

Image.thumbnail(size, resample=3):等比例缩放图像。参数size指定缩放后的大小,resample参数指定重采样算法,默认为3(BICUBIC),建议使用默认值。

from PIL import Image

image = Image.opne('/path/to/image.jpg')
image.thumbnail((300, 300)) # 等比例缩放到300*300像素
image.save('/path/to/thumbnail.jpg', format='JPEG', quality=90)

图像裁剪

Image.crop(box=None):裁剪指定区域的图像,参数box为指定区域的左上角坐标和右下角坐标的元组,格式为(left, up, right, bottom),左上角的坐标为(0, 0)

from PIL import Image

image = Image.open('/path/to/image.jpg')
box = (100, 100, 400, 400) # 左上角坐标为(100, 100),右下角坐标为(400, 400)
image_crop = image.crop(box)
image_crop.save('/path/to/crop.jpg', format='JPEG', quality=90)

图像旋转

Image.rotate(angle, resample=3):旋转图像。参数angle为角度值,表示顺时针旋转的角度,可以是正数或负数。resample参数为重采样算法,默认为3(BICUBIC),建议使用默认值。

from PIL import Image

image = Image.open('/path/to/image.jpg')
image_rotate = image.rotate(45) # 顺时针旋转45度
image_rotate.save('/path/to/rotate.jpg', format='JPEG', quality=90)

示例说明

示例1:批量转换图片格式

from PIL import Image
import os

def batch_convert(from_format, to_format, input_dir, output_dir):
    if not os.path.exists(output_dir):
        os.mkdir(output_dir)

    for file_name in os.listdir(input_dir):
        if file_name.endswith(from_format):
            file_path = os.path.join(input_dir, file_name)
            output_path = os.path.join(output_dir, file_name[:-4] + to_format)
            image = Image.open(file_path)
            image.save(output_path, format=to_format, quality=90)


if __name__ == '__main__':
    batch_convert('.png', '.jpg', '/path/to/input/dir', '/path/to/output/dir')

该示例功能为批量将指定目录下的所有png格式的图片转为jpg格式的图片。

示例2:图片水印

from PIL import Image, ImageDraw, ImageFont

def add_watermark(image_path, text, font_path, font_size):
    image = Image.open(image_path)
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype(font_path, font_size)
    text_width, text_height = draw.textsize(text, font)
    text_x = image.width - text_width
    text_y = image.height - text_height
    draw.text((text_x, text_y), text, font=font, fill=(255, 255, 255, 255)) # 在右下角添加白色文本
    image.save(image_path[:-4] + '_watermark.jpg', format='JPEG', quality=90)


if __name__ == '__main__':
    add_watermark('/path/to/image.jpg', 'test', '/path/to/font.ttf', 30)

该示例给指定的图片添加文本水印,使用的字体文件为.ttf格式,字体大小为30。水印文本默认添加在右下角。

营销型网站