美文网首页
11 pillow图像库

11 pillow图像库

作者: yungege | 来源:发表于2019-08-06 22:31 被阅读0次

11 pillow图像库

Pillow 中文文档https://pillow-cn.readthedocs.io/zh_CN/latest/

PIL库
PIL (Python Image Library) 已经算是 Python 处理图片的标准库了,兼具强大的功能和简洁的 API.
但是PIL库的更新非常缓慢, 并且它只支持到python2.7,不支持python3

Pillow
由于PIL库更新太慢了,于是于是一群志愿者在PIL库的基础上创建了一个新的分支版本,命名为Pillow.
Pillow目前最新支持到python3.6,它的维护和开发十分活跃,兼容PIL库的绝大多数语法,并且增加了许多新的特性,推荐直接使用Pillow

注意点
Pillow和PIL不能共存在一个环境中,如果你之前安装了PIL的话,需要删除掉才能在安装Pillow
由于是继承自PIL的分支, 所以Pillow库的导入是这样的
Import PIL

一、PIL基本概念

PIL中所涉及的基本概念有如下几个:通道(bands)、尺寸(size)、坐标系统(coordinate system)。

通道

每张图片都是由一个或者多个数据通道构成,如果这些通道具有相同的维数和深度,PIL允许将这些通道进行叠加
以RGB图像为例,每张图片都是由三个数据通道叠加构成,分别为R 、G 、B。
对于灰度图像(没有色彩的图片, RGB色彩分量全部相等),只有一个通道。
灰度指的是黑白图像中点的颜色深度,范围一般是0到255, 白色为255,黑色为0

对于一张图片的通道数量和名称,可以通过方法getbands()来获取。方法getbands()是PIL中Image子模块的方法,它会返回一个字符串组成的元祖,元祖中包括了每一个通道的名称。

尺寸

图片尺寸(size)指的是图片的宽度和高度
通过size属性可以获取图片的尺寸,它的返回值是一个元祖,元祖里面有两个值,分别是水平和垂直方向上的像素个数

坐标系统

PIL使用笛卡尔像素坐标系统,图像的左上角为左边的原点(0,0),这就意味着,x轴的数值是从左到右增长的,y轴的数值是从上到下增长的。
在我们处理图像的时候,常常需要去表示一个矩形的图像区域。Pillow中很多方法都需要传入一个表示矩形区域的元祖
这个元祖包含四个值,分别表示矩形四条边距离x轴或者y轴的距离。顺序是(左,顶,右,底)
例如,一个800x600的像素图像表示为(0, 0, 800, 600)

from PIL import Image

im = Image.open('yasuo.jpg')

# 获取通道
print('通道:', im.getbands())
# 获取尺寸size
print('尺寸:',im.size)

# 调用系统默认图片打开应用打开
im.show()

二、基本使用

1、加载图像

# 加载图像
im1 = Image.open('yasuo.jpg')
# 显示图片
im1.show()
# 获取图像的size及mode
# .format属性标识了图像的来源,如果图像不是从文件读取则返回None
# .size返回一个元组(width,height),单位为px
# .mode定义了图像bands的数量和名称,以及像素类型和深度,常见的值有"L"(luminance,灰度图),"RGB"(真彩色图像),"CMYK"(出版图像).
print('format:', im1.format)
print('size:', im1.size)
print('mode:',im1.mode)

2、新建图像

# 创建新的图像
im2 = Image.new('RGBA',(400,400),'red')
im2.show()

3、剪切图像

# 剪切图像
box = (100,100,700,700)
im3 = im1.crop(box)
im3.show()

4、旋转图像

# 使用.rotate(x)对图像进行旋转(x:图片逆时针旋转的角度)
im4 = im3.rotate(90)
# im4.show()
# 使用.transpose()对图片进行旋转
# 可传入的参数有:
# Image.FLIP_LEFT_RIGHT #图片左右翻转
# Image.FLIP_TOP_BOTTOM #图片上下翻转
im5 = im1.transpose(Image.FLIP_LEFT_RIGHT)
im6 = im1.transpose(Image.FLIP_TOP_BOTTOM)
im7 = im1.transpose(Image.ROTATE_90)
im5.show()
im6.show()
im7.show()

5、粘贴合并

# 使用.paste()对图片进行黏贴合并
# 粘贴矩形选区时必须保持尺寸一致
im8 = im1.crop((0,0,100,100))
im8.show()
im1.paste(im8,(700,700,800,800))
im1.show()

6、通道的分离与合并

from PIL import Image

im1 = Image.open('yasuo.jpg')
# 通道的分离与合并
r,g,b = im1.split()
print(r,g,b)
im = Image.merge("RGB", (g, b, r))
im.show()

7、缩放图像

# 缩放图像
# .resize((width,height))对图像进行大小变换,生成新的图像对象,原图不变
im9 = im1.resize((400,600))
im9.show()
# .thumbnail(self, size, resample=BICUBIC) 改变图像的大小,形成缩略图,原图改变
im1.thumbnail((200,200),Image.ANTIALIAS)
im1.show()

8、mode变换

# .convert("mode")颜色变换
# "L"(luminance,灰度图),"RGB"(真彩色图像),"CMYK"(出版图像).
im10 = im1.convert("L")
im11 = im1.convert("CMYK")
im12 = im1.convert('RGBA')
im13 = im1.convert('RGB')
print(im12.mode)
im12.show()

9、保存图像

# 保存图片
# .save()保存图片
im10.save("yasuo_L.jpg")

三、绘图

1、draw line

line(xy, fill)

from PIL import Image, ImageDraw

im1 = Image.open('1.jpg')

draw = ImageDraw.Draw(im1)

draw.line((0, 0)+im1.size, fill=120)
draw.line((0, im1.size[1], im1.size[0], 0), fill=120)

im1.show()

2、draw text

text(xy, text, fill, font, spacing, direction)

from PIL import Image, ImageDraw

im1 = Image.open('1.jpg')

draw = ImageDraw.Draw(im1)

draw.text((60, 60), 'good', fill=(0, 0, 0, 255))

im1.show()

3、draw arc

arc(xy,start,end,fill)

这个方法是画圆,xy需要给个box。比如在像素点(0,0)和(100,100)之间画圆。start是初始角度,0度为正右方。end当然就是结束角度,不过注意,画圆方向为顺时针,fill同上。

from PIL import Image, ImageDraw

im1 = Image.open('1.jpg')

draw = ImageDraw.Draw(im1)

draw.arc([60,60,500,500],0,270,fill='red')

im1.show()

4、draw chord

chord(xy, start, end, fill, outline)

这个方法和arc功能相同,outline是划线颜色,而fill是填充颜色。与arc的区别是,画完图之后,会将末位点和起始点连接起来。

from PIL import Image, ImageDraw

im1 = Image.open('1.jpg')

draw = ImageDraw.Draw(im1)

# 这个方法和arc功能相同,outline是划线颜色,而fill是填充颜色。与arc的区别是,画完图之后,会将末位点和起始点连接起来。
draw.chord([60,60,120,100],0,270,fill='blue', outline='yellow')

im1.show()

5、draw pieslice

pieslice

参数和功能都和chord一样,区别在于最后将末位点与起始点连接到中心

from PIL import Image, ImageDraw

im1 = Image.open('1.jpg')

draw = ImageDraw.Draw(im1)

# 参数和功能都和chord一样,区别在于最后将末位点与起始点连接到中心 
draw.pieslice([60,60,120,100],0,270,fill='blue', outline='yellow')

im1.show()

6、draw ellipse

参数和画圆的都一样,而且通过arc也可以实现相同的功能

from PIL import Image, ImageDraw

im1 = Image.open('1.jpg')

draw = ImageDraw.Draw(im1)

# 参数和画圆的都一样,而且通过arc也可以实现相同的功能 
draw.ellipse([60,60,500,300],fill='red')

im1.show()

7、draw rectangle

rectangle(xy,fill,outline)

绘制矩形,xy给出rectangle的左上和右下的像素点坐标,fill填充,outline是pen color。

from PIL import Image, ImageDraw

im1 = Image.open('1.jpg')

draw = ImageDraw.Draw(im1)

# 绘制矩形,xy给出rectangle的左上和右下的像素点坐标,fill填充,outline是pen color。
draw.rectangle([60,60,500,300],fill='red',outline='yellow')

im1.show()

8、draw polygon

polygon(xy, fill, outline)

polygon,多边形。xy又是个像素点坐标的序列

from PIL import Image, ImageDraw

im1 = Image.open('1.jpg')

draw = ImageDraw.Draw(im1)

# polygon,多边形。xy又是个像素点坐标的序列 
draw.polygon([60,60,100,60,130,80,80,150],fill='red',)
im1.show()

8、draw point

point(xy, fill)

from PIL import Image, ImageDraw

im1 = Image.open('1.jpg')

draw = ImageDraw.Draw(im1)

# 画点
draw.point([60,60,62,60,64,60,66,60,68,60,70,60],fill='blue',)
im1.show()

四、其它功能

1、截屏

ImageGrab.grab() 实现抓屏

from PIL import ImageGrab

image1 = ImageGrab.grab()  #可传入一个元组表示抓取屏幕的坐标
print(image1.size,image1.mode)
# image1.save("截屏.jpg")
image1.show()

2、滤镜

使用.filter()对图片进行滤镜处理

from PIL import Image, ImageFilter

im1 = Image.open('yasuo.jpg')
# im1.show()
im2 = im1.filter(ImageFilter.BLUR)
im2.show()

3、综合例子

#图片处理:
from PIL import Image
from PIL import ImageFilter
from PIL import ImageEnhance
img = Image.open("D:\python\dog.jpg")
print(img.format)        # 输出图片基本信息
print(img.mode)
print(img.size)
img_resize = img.resize((256,256)) # 调整尺寸
img_resize.save("dogresize.jpg")
img_rotate = img.rotate(45)         # 旋转
img_rotate.save("dogrotate.jpg")
om=img.convert('L')             # 灰度处理
om.save('doggray.jpg')
om = img.filter(ImageFilter.CONTOUR)        # 图片的轮廓
om.save('dogcontour.jpg')
om = ImageEnhance.Contrast(img).enhance(20)     # 对比度为初始的10倍
om.save('dogencontrast.jpg')
#更改图片格式:
from PIL import Image
import os

filelist =["dog.jpg",
           "dogcontour.jpg",
           "dogencontrast.jpg",
           "doggray.jpg",
           "dogresize.jpg",
           "dogrotate.jpg",
           ]
for infile in filelist:
  outfile = os.path.splitext(infile)[0] + ".png"
  if infile != outfile:
    try:
      Image.open(infile).save(outfile)
    except IOError:
      print ("cannot convert", infile)

相关文章

网友评论

      本文标题:11 pillow图像库

      本文链接:https://www.haomeiwen.com/subject/skvgdctx.html