安装:
pip install Pillow
引入:
import PIL
from PIL import Image
简述
pillow库志愿者在PIL的基础上创建了一个分支版本,命名为Pillow。这个库专们用来处理图片,支持最新的python3版本。
坐标系统
PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角,从上往下为正方向,从左到右为正方向。
坐标经常用于二元组(x,y)。长方形则表示为四元组,前面是左上角坐标。例如,一个覆盖800x600的像素图像的长方形表示为(0,0,800,600)。
颜色空间模型
常用到的有’1’、‘L’、‘RGB’。
1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。
L:8位像素,表示黑和白。
P:8位像素,使用调色板映射到其他模式。
RGB:3x8位像素,为真彩色。
RGBA:4x8位像素,有透明通道的真彩色。
CMYK:4x8位像素,颜色分离。
YCbCr:3x8位像素,彩色视频格式。
I:32位整型像素。
F:32位浮点型像素。
PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。
常用方法
新建图片
from PIL import Image
img = Image.new(mode,size,color)
加载图片
from PIL import Image
img = Image.open('filepath') # 文件地址
# 读入二进制图片
import numpy as np
# 读取二进制数据
f = open("input.raw", 'rb')
image_bytes = fd.read()
f.close()
# 转为数组
nparr = np.asarray(bytearray(image_bytes), dtype="uint8")
image = nparr.reshape((960, 540)) # (height, width)
# 读取图片
img = Image.fromarray(binary)
保存图片
img.save('filename')
裁剪(复制)图片
croped_img = img.crop((100,100,200,200)) # 坐标的四个角
粘贴图片
box = (100, 100, 400, 400)
region = im.crop(box)
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
缩放尺寸
这样是直接拉伸的结果,不是进行裁剪哦
img = img.resize((24,24))
在这里插入代码片
旋转图片
img = img.rotate(angle) # 逆时针旋转angle度,加上expand=true表示将图片的边角保留
翻转图片
# 水平翻转
img = img.transpose(Image.FLIP_LEFT_RIGHT)
# 垂直翻转
img = img.transpose(Image.FLIP_TOP_BOTTOM)
展示图片
img.show()
提高图片亮度
from PIL import Image
img = Image.open("jing.jpg")
def deffun(c):
return c*0.89 #改变了亮度
img_eval = Image.eval(img,deffun)
img_eval.save("gai.jpg")
改变模式
from PLI import Image
im = Image.open('hopper.ppm').convert('L')
其他操作
其他关于图片通道等等的操作我应该会在opencv中介绍。
下面是我看到的一篇介绍的比较详细的博客,大家有兴趣可以学习一下。
https://blog.csdn.net/swinfans/article/details/101989157
常用属性
- filename:返回文件名
- format:返回文件格式,如png,如果是由PIL创建的图像,则其文件格式为None。
- mode:返回颜色空间模型,该属性典型的取值为“1”,“L”,“RGB”或“CMYK”。
- size:返回图片尺寸
- width:返回图片宽度
- height:返回图片高度
- info:返回图片一些信息,以字典形式
使用pillow在图片上加文字
在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦。OpenCV中并没有使用自定义字体文件的函数,这不仅意味着我们不能使用自己的字体,而且意味着他无法显示中文字符。这还是非常要命的事情。而且他显示出来的文字位置也不太好控制。但是使用pillow就很方便,它还可以指定字体。
from PIL import ImageFont, ImageDraw, Image
img = Image.open("image.jpg")
#设置需要显示的字体
fontpath = "font/simsun.ttc"
font = ImageFont.truetype(fontpath, 32)
# 创建draw对象,使用它来写字
draw = ImageDraw.Draw(img)
#绘制文字信息
draw.text((100, 300), "Hello World", font = font, fill = (255, 255, 255))
draw.text((100, 350), "你好", font = font, fill = (255, 255, 255))
bk_img = np.array(img_pil)
img.show()
img.save('new.png')