python --Pillow库详解(换人像图背景)
- https://pillow.readthedocs.io/en/latest/handbook/tutorial.html#converting-between-modes
-
- 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个参数。
- # 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)}
-
模式 | 简介 |
---|---|
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位浮点像素 |
颜色与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个参数。
- 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()
-
- 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)
-
- 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)
-