python --Pillow库详解(换人像图背景)

官文链接

https://pillow.readthedocs.io/en/latest/handbook/tutorial.html#converting-between-modes

安装Pillow

pip install Pillow

Pillow库安装成功后,导包时要用PIL来导入,而不能用pillow或Pillow

import PIL
from PIL import Image

常用的是Image模块,Image模块可以对图像做进一步的特殊处理;

打开本地图片

# coding=utf-8
from PIL import Image
 
image = Image.open("yazi.jpg")
image.show()

open(fp, mode=‘r’): 打开一张图片,是Image模块中的函数。如果图片与当前代码在同一目录下,可以只写图片的文件名,其他情况需要拼接图片的路径。mode默认为’r’,也必须为’r’。

show(): 调用图片显示软件打开图片。打开后程序会阻塞,需要手动关闭。

创建一张新图片

from PIL import Image

img = Image.new('RGB', (160, 90), (0, 0, 255))
img.show()

new(mode, size, color=0): 创建一张图片(画布),用于绘图,是Image模块中的函数。有3个参数。

  • mode, 图片的模式,如“RGB”(red,green,blue三原色的缩写,真彩图像)、“L”(灰度,黑白图像)等。

  • size, 图片的尺寸。是一个长度为2的元组(width, height),表示的是像素大小。

  • color, 图片的颜色,默认值为0表示黑色。可以传入长度为3的元组表示颜色,也可以传入颜色的十六进制,在版本1.1.4后,还可以直接传入颜色的英文单词,如上面代码中的(0, 0, 255)可以换成‘#0000FF’或‘blue’,都是表示蓝色。

Image模块的常用属性

# coding=utf-8
from PIL import Image

image = Image.open(r'C:\Users\ht-desktop-001\Desktop\2.png')

print('width: ', image.width)
print('height: ', image.height)
print('size: ', image.size)
print('mode: ', image.mode)
print('format: ', image.format)
print('category: ', image.category)
print('readonly: ', image.readonly)
print('info: ', image.info)
# img.show()

输出:

width:  457
height:  330
size:  (457, 330)
mode:  RGBA
format:  PNG
category:  0
readonly:  1
info:  {'srgb': 0, 'gamma': 0.45455, 'dpi': (96, 96)}
  • width属性表示图片的像素宽度,height属性表示图片的像素高度,width和height组成了size属性,size是一个元组。

  • mode属性表示图片的模式,如RGBA,RGB,P,L等。

  • format属性表示图片的格式,格式一般与图片的后缀扩展名相关。category属性表示图片的的类别。

  • readonly属性表述图片是否为只读,值为1或0,表示的是布尔值。

  • info属性表示图片的信息,是一个字典。

图片的模式

模式简介
11位像素,黑白,每字节存储一个像素
L8位像素,黑白
P8位像素,使用调色板映射到任何其他模式
RGB3x8位像素,真彩
RGBA4x8位像素,带透明蒙版的真彩
CMYK4x8位像素,分色
YCbCr3x8位像素,彩色视频格式
LAB3x8位像素,L * a * b颜色空间
HSV3x8位像素,色相,饱和度,值颜色空间
I32位有符号整数像素
F32位浮点像素

颜色与RGBA值

计算机通常将图像表示为RGB值,或者再加上alpha值(通透度,透明度),称为RGBA值。在Pillow中,RGBA的值表示为由4个整数组成的元组,分别是R、G、B、A。整数的范围0~255。RGB全0就可以表示黑色,全255代表黑色。可以猜测(255, 0, 0, 255)代表红色,因为R分量最大,G、B分量为0,所以呈现出来是红色。但是当alpha值为0时,无论是什么颜色,该颜色都不可见,可以理解为透明

图片的模式转换

# coding=utf-8
from PIL import Image

with Image.open(r'C:\Users\ht-desktop-001\Desktop\088.png') as img:
    print(img.mode)  # RGBA

    image1 = img.convert('1')
    print(image1.mode)  # 1
    image1.show()

    image2 = img.convert('L')
    print(image2.mode)  # L
    image2.show()

    image3 = img.convert('P')
    print(image3.mode)  # P
    image3.show()

    image4 = img.convert('RGB')
    print(image4.mode)  # RGB
    image3.show()

    image5 = img.convert('RGBA')
    print(image5.mode)  # RGBA
    image5.show()

    image6 = img.convert('CMYK')
    print(image6.mode)  # CMYK
    image6.show()

    image7 = img.convert('YCbCr')
    print(image7.mode)  # YCbCr
    image7.show()

    # image8 = img.convert('LAB')
    # print(image8.mode)  # 报错
    # image8.show()

    image9 = img.convert('HSV')
    print(image9.mode)  # HSV
    image9.show()

    image10 = img.convert('I')
    print(image10.mode)  # I
    image10.show()

    image11 = img.convert('F')
    print(image11.mode)  # F
    image11.show()

在这里插入图片描述
convert(self, mode=None, matrix=None, dither=None, palette=WEB, colors=256): 将图片转换为指定的模式,并且返回转换后的图片副本。如果不指定模式,则自动选择一种能保留图片所有信息且不使用调色板的模式(通常的结果是不转换)。将彩色图像转换为灰度(‘L’)时,使用ITU-R 601-2进行亮度转换:L = R * 299/1000 + G * 587/1000 + B * 114/1000 。将灰度(‘L’)或真彩(‘RGB’)转换为模式’1’时,如果dither参数为’NONE’,所有大于128的值均设置为255(白色),所有其他值都设为0(黑色)。

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种颜色。

图片拷贝粘贴和保存

from PIL import Image
 
 
image = Image.open("yazi.jpg")
image_copy = image.copy()
# image_copy.show()
image_new = Image.new('RGB', (160, 90), (0, 0, 255))
image_new2 = Image.new('L', (160, 90), '#646464')
image_copy.paste(image_new, (100, 100, 260, 190), mask=image_new2)
image_copy.save('duck.png')
image_save = Image.open('duck.png')
print(image_save.format, image_save.mode)
image_copy.show()
  • 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的元组(x0, y0, x1, y1),表示图片粘贴的区域,此时区域的大小必须与被粘贴图片一致,否则会报错,传入的元组长度为其他值也会报错。

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

  • save(fp, format=None, **params): 将当前图片按指定的文件名保存,运行后会将图片按新名字保存在当前路径下(也可以指定路径)。文件名最好带扩展名,方便打开,format表示图片的格式,没有指定format则会根据扩展名来解析(如果能解析出来),一般不需要指定format,传入一个带扩展名的文件名即可。

图片的裁剪和缩放

from PIL import Image
 
 
image = Image.open("yazi.jpg")
image_crop = image.crop(box=(300, 300, 800, 700))
# image_crop.show()
print('before resize: ', image.size)
image_resize = image.resize((500, 400), resample=Image.LANCZOS, box=(100, 100, 1200, 800), reducing_gap=5.0)
print('after resize: ', image_resize.size)
image_resize.show()

结果

before resize:  (1557, 911)
after resize:  (500, 400)
  • crop(box=None): 裁剪图片,返回裁剪区域的图片。box表示裁剪的区域,传入长度为4的元组(x0, y0, x1, y1),不传默认为拷贝原图,相当于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的元组(x0, y0, x1, y1),这个区域必须在原图的(0, 0, width, height)范围内,如果超出范围会报错,如果不传值则默认将整张原图进行缩放。

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

换人像图背景

from PIL import Image


img = Image.open(r'C:\Users\1\Desktop\1111.png')  # 人像图

circle = Image.new('RGB', (255, 350), (0, 191, 255))   # 画布背景色  (宽,高) (画布颜色)

img1 = img.resize((255, 350))  # 缩放图片与画布大小一致
circle.paste(img1, (0, 0), img1)   # 在画布上贴人像图
# circle.show()   # 预览
circle.save('1.jpg')  # 保存

贴图

from PIL import Image

def paste_img(big_img, small_img, x_shifting=0, y_shifting=0):
    '''
    贴图
    @params big_img    --> 大图;
    @params small_img  --> 小图;
    @params x_shifting --> X轴偏移(可以为负数,默认居中);
    @params y_shifting --> Y轴偏移(可以为负数,默认居中);
    '''
    img = Image.open(big_img)
    img_size = img.size
    print(f'大图尺寸:【{img_size}】')
    img1 = Image.open(small_img)
    img1_size = img1.size
    print(f'小图尺寸:【{img1_size}】')

    x, y = img_size[0] // 2 - img1_size[0] // 2 - x_shifting, img_size[1] // 2 - img1_size[1] // 2 - y_shifting
    img.paste(img1, box=(x, y))
    # img.show()
    img.save('111.png')

paste_img('D:\yi\yan_lian\media\share\share_bg.jpg', r'D:\yi\yan_lian\backstage\11.png', x_shifting=0, y_shifting=-1038)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值