安装
pip install pillow
Image类
可以说是(PIL:Python Image Library)里最重要的一个类了,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片。
使用open()
函数可以从文件加载图像
例如:
from PIL import Image
img = Image.open("C:/Users/15338/Pictures/Saved Pictures/dog.jpg")
print(img.format, img.size[0], img.size, img.mode)
JPEG 353 (353, 409) RGB
format 这个属性标识了图像来源。如果图像不是从文件读取它的值就是None。size
属性是一个二元tuple,包含width和height(宽度和高度,单位都是px)。 mode 属性定义了图像bands的数量和名称,以及像素类型和深度,“RGB” 表示真彩色图像。
图片的坐标表示
图像中左上角是坐标原点(0, 0),这和平常数学里的坐标系不太一样。这样定义的坐标系意味着,X轴是从左到右增长的,而Y轴是从上到下增长。
在Pillow中如何使用上述定义的坐标系表示一块矩形区域?许多函数或方法要求提供一个矩形元组参数。元组参数包含四个值,分别代表矩形四条边的距离X轴或者Y轴的距离。顺序是(左,顶,右,底)
。右和底坐标稍微特殊,表示直到但不包括。可以理解为[左, 右)和[顶, 底)这样左闭右开的区间。比如(3, 2, 8, 9)
就表示了横坐标范围[3, 7)
;纵坐标范围[2, 8)
的矩形区域。
图片处理
图片裁剪
cropedImg = img.crop((100, 0, 300, 200))
cropedImg.save(r'C:/Users/15338/Pictures/Saved Pictures/cropdog.jpg')
cropedImg.show()
show()
方法会调用系统默认图像查看软件,打开并显示。save()
可保存处理后的图片,如果未经处理,保存后的图像占用的空间(字节数)一般也与原图像不一样,可能经过了压缩。
粘贴
img.paste(cropedImg, (0, 0))
img.show()
这如果之后还会用到原图的信息,由于信息被改变就很麻烦。所以paste前最好使用copy()复制一个副本,在此副本操作,不会影响到原图信息。
几何变换
img.rotate(90).save('C:/Users/15338/Pictures/Saved Pictures/rotate90.jpg')
逆时针旋转
img.transpose(Image.FLIP_LEFT_RIGHT).save(r'C:/Users/15338/Pictures/Saved Pictures/transepose_lr.jpg')
img.transpose(Image.FLIP_TOP_BOTTOM).save(r'C:/Users/15338/Pictures/Saved Pictures/transepose_tb.jpg')
图像的镜面翻转。transpose()
函数可以实现,必须传入Image.FLIP_LEFT_RIGHT
或者Image.FLIP_TOP_BOTTOM
,第一个是水平翻转,第二个是垂直翻转。
颜色空间变换
convert()
函数
gray = img.convert("L")
gray.show()
其他模块
Pillow使用ImageFilter
可以简单做到图像的模糊、边缘增强、锐利、平滑等常见操作。(具体见百度)
ImageDraw,ImageFont
from PIL import Image, ImageDraw, ImageFont
img = Image.open(r'C:\Users\15338\Pictures\Saved Pictures\dog.jpg')
draw = ImageDraw.Draw(img)
text = 'HelloWorld'
Font = ImageFont.truetype("C:\Windows\Fonts\SHOWG.TTF",48)
draw.text([5,30],text,"red", font=Font)
img.save(r'C:\Users\15338\Pictures\Saved Pictures\dog.jpg')
生成随机字母验证码
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
# 随机字母:
def rndChar():
return chr(random.randint(65, 90))
# 随机颜色1:
def rndColor():
return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))
# 随机颜色2:
def rndColor2():
return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))
# 240 x 60:
width = 60 * 4
height = 60
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建Font对象:
font = ImageFont.truetype('C:\Windows\Fonts\SHOWG.TTF', 36)
# 创建Draw对象:
draw = ImageDraw.Draw(image)
# 填充每个像素:
for x in range(width):
for y in range(height):
draw.point((x, y), fill=rndColor())
char = []
# 输出文字:
for t in range(4):
ch = rndChar()
char.append(ch)
draw.text((60 * t + 10, 10), ch, font=font, fill=rndColor2())
# 模糊:
image = image.filter(ImageFilter.BLUR)
image.save('D:\code.jpg', 'jpeg');
print(char)
================= RESTART: C:\Users\15338\Desktop\pillow.py =================
['C', 'M', 'N', 'T']
>>>
参考:
http://www.cnblogs.com/sun-haiyu/p/7127582.html
http://python.jobbole.com/83685/
http://blog.csdn.net/dou_co/article/details/17618319
http://effbot.org/imagingbook/
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140767171357714f87a053a824ffd811d98a83b58ec13000