Pillow 图片处理模块

Pillow 图片处理模块

Pillow是Python第三方库,Python2中有一个叫PIL(Python Imaging Library)的标准库,但不支持Python3,所以一些志愿者在PIL的基础上创建了Pillow,支持Python3。Pillow支持动态图像编辑。

  1. 安装Pillow

    pip install pillow

    Pillow安装成功后,需要用PIL导入:

    import PIL

    from PIL import Image

    Image是最常用的模块。

  2. 打开或者新建一张图片

    import PIL
    from PIL import Image
    pic = Image.open('11.jpg')
    pic.show()
    im = Image.new('RGB', (480, 640), ('pink'))
    im.show()
    

    Image.new()方法有三个参数:图像模式(RGB),图像尺寸(宽,高),颜色(red,green,blue),颜色可以直接用#0000FF或者blue表示蓝色。

    Image.show()方法可以调用系统自带的图像查看程序显示当前图片,如系统中并未安装相应程序,有执行程序时将无任何显示。

  3. Image模块的常用属性

    print('宽:', pic.width)  # 宽: 1361
    print('高:', pic.height)  # 高: 1814
    print('尺寸:', pic.size)  # 尺寸: (1361, 1814)
    print('色彩模式:', pic.mode)  # 色彩模式: RGB
    print('图像格式:', pic.format)  # 图像格式: JPEG
    # print('图片类别:', pic.category)
    print('只读:', pic.readonly)  # 只读: 1
    print('图片信息:', pic.info)  # 图片信息: {'jfif': 257, 'jfif_version': (1, 1), 'jfif_unit': 0, 'jfif_density': (1, 1)}
    

    其中size属性返回的是一个元组。

  4. Image.convert()方法进行图像模式(mode)转换,支持以下标准模式:

    convert(self, mode=None, matrix=None, dither=None, palette=WEB, colors=256): 将当前图片转换为指定的模式,并且返回转换后的图片。

    如果不指定模式,则选择一种能保留图片所有信息且不使用调色板的模式(通常的结果是不转换)。

    mode 描述
    1 1位像素,黑白,每字节存储一个像素
    L 8位像素,黑白
    P 8位像素,使用调色板映射到任何其他模式
    RGB 3x8位像素,真彩色
    RGBA 4x8位像素,带透明蒙版的真彩色
    CMYK 4x8位像素,分色
    YCbCr 3x8位像素,彩色视频格式
    LAB 3x8位像素,L * a * b颜色空间
    HSV 3x8位像素,色相,饱和度,值颜色空间
    I 32位有符号整数像素
    F 32位浮点像素

    1位像素的范围是0-1,0表示黑1表示白,中间表示灰。8位像素的范围是0-255,如RGB的(0, 0, 0)表示黑,(255, 255, 255)表示白,依此类推。

    pic1 = pic.convert('1')
    pic1.show()
    

    convert()方法有5个参数,都有默认值,根据转换的模式来传值:

    mode,图片的模式,传入需要转换的模式。部分模式之间不支持转换,代码会报错。

    matrix, 转换矩阵。传入该参数时,应该传入由浮点数构成的元组,元组长度为4或12。matrix只支持从少数模式转换成'L'或'RGB'。

    dither, 高频振动,用于控制颜色抖动。从模式'RGB'转换为'P'或从'RGB'或'L'转换为'1'时使用。可用的方法有'NONE'或'FLOYDSTEINBERG'(默认)。当提供了matrix参数时不使用此功能。

    palette, 调色板,用于控制调色板的产生。从模式'RGB'转换为'P'时使用,可用的方法有'WEB'(默认)或'ADAPTIVE'。'ADAPTIVE'表示使用自适应的调色板。

    colors, 自适应调色板使用的颜色数。当palette参数为'ADAPTIVE'时,用于控制调色板的颜色数目。默认是最大值,即256种颜色。

  5. 图片的复制、粘贴和保存

    pic = Image.open('11.jpg')
    im = Image.new('RGB', (128, 128), (255, 0, 0))
    im1 = Image.new('RGBA', (128, 128), (0, 0, 255))
    pic1 = pic.copy()
    pic1.paste(im, (640, 600), mask=im1)
    pic1.save('22.jpg', quality=95, subsampling=0)
    

    Image.copy()方法:将指定对象复制并返回。

    Image.paste(im,(行,列),mask=None):在当前图片对象基础上,把im对象粘贴到指定位置,mask参数指定蒙板。

    Image.save()方法:保存当前图片对象到指定位置。

    具体说明

    copy(): 拷贝当前的图片,拷贝出来的图片与原图一模一样。如果想在图片上粘贴一些内容,又想保留原图时,可以使用此方法。

    paste(im, box=None, mask=None): 将另一张图片粘贴到当前图片中,如果粘贴的模式不匹配,则将被粘贴图片的模式转换成当前图片的模式。有3个参数。

    im, 被粘贴的图片。传入一张图片,当第二个参数box指定的是一个区域时,im参数也可以是一个整数或颜色值(元组表示,16进制表示和颜色名都可以,如上面代码中的image_new可以换成(0, 0, 255), '#0000FF', 'blue')。

    box, 图片粘贴的位置或区域。传入一个长度为2或4的元组,如果不传值,默认为(0, 0),图片被粘贴在当前图片的左上角。如果传入长度为2的元组(x, y),表示被粘贴图片的左上角坐标位置。如果传入长度为4的元组(x1, y1, x2, y2),表示图片粘贴的区域,此时区域的大小必须与被粘贴图片一致,否则会报错,传入的元组长度为其他值也会报错。

    mask, 蒙版。传入一张与被粘贴图片尺寸一样的图片,可以使用模式为'1'、'L'或者'RGBA'的图像。如果mask图像的颜色值为255,则直接按被粘贴图片的颜色粘贴,如果mask图像的颜色值为0,则保留当前图片的颜色(相当于没有粘贴),如果mask图像的颜色值为0~255之间的值,则将im与mask进行混合后再粘贴。

    save(fp, format=None, quality=95, subsampling=0): 将当前图片按指定的文件名保存,运行后会将图片按新名字保存在当前路径下(也可以指定路径)。文件名最好带扩展名,方便打开,format表示图片的格式,没有指定format则会根据扩展名来解析(如果能解析出来),一般不需要指定format,传入一个规范的文件名即可。quality:压缩比,默认是75。subsampling:可选参数为0,1,2;选择0即可实现小变大的需求。

  6. 图片裁剪和缩放

    pic = Image.open('11.jpg')
    im_crop = pic.crop(box=(200, 200, 680, 840))
    im_crop.show()
    im_resize = pic.resize((480, 640),reducing_gap=2)
    im_resize.show()
    

    im_crop = pic.crop(box=(200, 200, 680, 840)):裁剪图片,box参数中的四个数字为图片坐标,分别是x1,y1,x2,y2。

    im_resize = pic.resize((480, 640),reducing_gap=2)

    crop(box=None):裁剪图片,返回裁剪区域的图片。box表示裁剪的区域,传入长度为4的元组(x1, y1, x2, y2),不传默认为拷贝原图,相当于copy()方法,如果裁剪的区域超过了原图的区域,超出部分用像素格填充。

    resize(size, resample=BICUBIC, box=None, reducing_gap=None): 缩放图片,返回缩放后的图片。有4个参数。

    size, 图片缩放后的尺寸,传入一个长度为2的元组(width, height)。

    resample, 重采样,是一个可选的重采样过滤器。可以传入Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, Image.BICUBIC, Image.LANCZOS。默认过滤器为Image.BICUBIC。如果图像的模式为'1'或'P',则始终设置为Image.NEAREST。

    box, 缩放图片的区域。传入长度为4的元组(x1, y1, x2, y2),这个区域必须在原图的(0, 0, width, height)范围内,如果超出范围会报错,如果不传值则默认将整张原图进行缩放。

    reducing_gap, 减少间隙。传入一个浮点数,用于优化图片缩放效果,默认不进行优化,值大于3.0时优化效果基本已经是公平的重采样。

  7. 图片旋转和翻转

    • rotate()方法:将图片对象进行旋转,可以实现顺时针或逆时针任意角度。
    • transpose()方法:将图片对象进行顺时针或逆时针90度旋转或者翻转,区别于上面的方法不能任意角度,但可以进行垂直或水平翻转。 ★★★★★这个方法比较常用,但根据系统提示在Pillow10(2023-07-01)更新后会停用现在的方法。
    im_resize.rotate(45).show()         # 图片向左(逆时针)旋转45度并显示。
    im_resize.transpose(Image.FLIP_LEFT_RIGHT).show()   # 逆时针旋转90度并显示。
    im_resize.transpose(Image.FLIP_TOP_BOTTOM).show()   # 逆时针旋转90度并显示。
    im_resize.transpose(Image.ROTATE_90).show()     # 逆时针旋转90度并显示。
    im_resize.transpose(Image.ROTATE_180).show()    # 逆时针旋转90度并显示。
    im_resize.transpose(Image.ROTATE_270).show()    # 逆时针旋转90度并显示。
    
  8. 图片特效

    Pillow提供一些简单的图片特效使用,需要从PIL库中导入ImageFilter模块。

     pic = Image.open('11.jpg')
     def pic_filter(imfile, x):
         filters = [
             ImageFilter.BLUR,   # 模糊效果
             ImageFilter.DETAIL, # 细节效果
             ImageFilter.CONTOUR,    # 轮廓效果
             ImageFilter.EDGE_ENHANCE,   # 边缘增强(比锐化更好)
             ImageFilter.EDGE_ENHANCE_MORE,  # 进一步边缘增强
             ImageFilter.FIND_EDGES, # 查找边缘
             ImageFilter.EMBOSS,     # 浮雕效果
             ImageFilter.SHARPEN,    # 锐化
             ImageFilter.SMOOTH,     # 平滑
             ImageFilter.SMOOTH_MORE,    # 进一步平滑
         ]
     return imfile.filter(filters[x]) # 根据列表序号选择效果并显示
     pic_filter(pic,3).show()
    
posted @ 2022-04-19 16:56  amwkvi  阅读(351)  评论(0编辑  收藏  举报