python高级图像库 Pillow学习

1
频段

一个图片允许包含一个或多个频段. Python Imaging Library 允许你在单个图像中存储多个频段. 包括原图像的尺寸和大小. 举个例子, 一个PNG图片可能包含 ‘R’, ‘G’, ‘B’, 和 ‘A’ 频段来表示红, 绿, 蓝和 alpha 透明值. 有许多对应频段的操作. 例如: histograms. 它常常用来处理不同像素的每个频段的值.

要想获得图像的频段的数量和名称, 使用 getbands() 方法.

模式 图像的 mode 定义了这个图像每一个像素点的大小. 目前版本支持以下标准模式:

1 (1-bit 像素点, 黑白, 一个像素点占用一个byte) L (8-bit 像素点, 黑白) P (8-bit 像素点, 使用调色板来映射其他模式) RGB (3x8-bit 像素点, 真彩) RGBA (4x8-bit 像素点, 带有透明标记的真彩) CMYK (4x8-bit 像素点, 分色) YCbCr (3x8-bit 像素点, 图像视频格式) 值得注意的是这个属于 JPEG, 而并不是 ITU-R BT.2020, standard LAB (3x8-bit 像素点, L_a_b 色彩空间) HSV (3x8-bit 像素点, Hue, Saturation, Value 色彩空间) I (32-bit 有符号整数像素) F (32-bit 浮点像素)

打开和查看一个文件

from PIL import Image

>>im = Image.open(“lena.ppm”)

>> from future import print_function >> print(im.format, im.size, im.mode) PPM (512, 512) RGB

os.path.splitext()可以用来分离文件名和文件格式

im.format 如果图片打开失败,则为None

im.size返回元祖(宽,高)

im.mode 这个属性代表图片的band属性, 一般情况(黑白)下为 “L”, 当图片是彩色的时候是 “RGB”, 如果图片经过压缩,则是 “CMYK”.

根据图片生成缩略图

im.thumbnail(size)    可以设置缩略图的大小

from __future__ import print_function
import os, sys
from PIL import Image

size = (128, 128)

for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0] + “.thumbnail”
if infile != outfile:
try:
im = Image.open(infile)
im.thumbnail(size)
im.save(outfile, “JPEG”)
except IOError:
print(“cannot create thumbnail for”, infile)

截取图片的某个区域的矩形

尺寸排序为 (左, 上, 右, 下),截取的部分就是一个坐标系

box = (100, 100, 400, 400)
region = im.crop(box)
region.show()

将某个图片复制到另外一张

将截图的某个图片进行平铺

from PIL import Image
im = Image.open(‘xej.jpg’)
box = (100, 100, 400, 400)
region = im.crop(box)

region.show()

region = region.transpose(Image.ROTATE_180) #旋转180度
im.paste(region, box)
im.show()

图片旋转

图片围绕着自身旋转,默认是自身为中心点旋转,当是正数是则为逆时针旋转

out = im.rotate(-45)
out.show()

图片镜像

out = im.transpose(Image.FLIP_LEFT_RIGHT)
out.show()

图片翻转

out = im.transpose(Image.FLIP_TOP_BOTTOM)
out.show()

它也可以根据度数来旋转,不过只有三个固定的度数90、180和270度

out = im.transpose(Image.ROTATE_90)

它的旋转和im.rotate()是右区别的,让他们都旋转90度,左为im.rotate(),不会改变图片的尺寸但不能完全显示;右边为im.transpose(Image.ROTATE_90),会改变图片尺寸能完全显示

图片模式转换

在L模式下图片色彩会变成黑白的

im = im.convert(“L”)

图片滤镜

out = im.filter(ImageFilter.DETAIL)

创建一个空白图像

图片模式,图片大小,图片颜色

im = Image.new(‘1’,(100,100),’white’)

在一个图像写入一个线条

前面参数是坐标(左上右下),后面是颜色

draw = ImageDraw.Draw(im)
draw.line((0, 0,255,255), fill=(255,255,255))

文本使用指定字体写入图像

1.设置字体和字体大小

2.定义文字的左上角坐标,文本,字体,字体颜色

fnt = ImageFont.truetype(‘msyh.ttf’, 40)

d = ImageDraw.Draw(image)

d.text((10,10), “Hello”, font=fnt, fill=(255,255,255,128))