PIL 基本用法2
PIL Image 转 byte 数组
https://stackoverflow.com/questions/33101935/convert-pil-image-to-byte-array
import io
import base64
from PIL import Image
img = Image.open("1.jpg", mode='r')
imgByteArr = io.BytesIO()
# 重新保存为 jpg 会再次有压缩,大小可能与原图不同
# quality 设置图像的品质,默认为75
roiImg.save(imgByteArr, format='JPEG', quality=90)
imgByteArr = imgByteArr.getvalue()
base64_str = base64.b64encode(imgByteArr) # 可转为 base64
剪切、粘贴、合并图像
从图像中复制出一个矩形选区
print(im.size) # (500, 750)
box = (100, 100, 400, 400)
region = im.crop(box)
region.show()
矩形选区有一个四元元组定义,分别表示左上、右下的坐标。这个库以左上角为坐标原点,单位是 px,所以上述代码复制了一个 300x300 pixels 的矩形选区。这个选区现在可以被处理并且粘贴到原图。
处理复制的矩形选区并粘贴到原图
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
im.show()
当粘贴矩形选区的时候必须保证尺寸一致。此外,矩形选区不能在图像外。然而不必保证矩形选区和原图的颜色模式一致,因为矩形选区会被自动转换颜色。
分离和合并颜色通道
im = Image.open('lena.jpg')
r, g, b = im.split()
如果是单色通道的图片,使用 split()
之后会返回图片本身。你可以使用 r.show()
来查看分离颜色通道后的图片。
将分离的颜色合并为 RGB 可用 merge()
方法:
img = Image.merge('RGB', (b, g, r)) # 以 b,g,r 顺序合并
img.show()
几何变换
PIL.Image.Image
类包含了设置图像大小 resize()
和旋转图像 rotate()
的方法。
resize() 接收一个元组来指定新大小。rotate() 接收一个逆时针的角度值。
简单的几何变换
print(im.size) # (500, 750)
im_resize = im.resize((250, 250)) # 设置图像大小
im_resize.show()
im_rotate = im.rotate(45) # 旋转图像
im_rotate.show()
旋转图像
如果要将图片旋转 90° 的整数倍,可以使用 rotate() 方法或者 transpose()
方法。transpose() 还可以将图片按照其竖直或水平边缘翻转。
out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)
使用 transpose(ROTATE) 和 rotate() 是没有区别的。更普遍的方法是使用 transform() 方法。
颜色模式变换
im.convert('L').show()
PIL 库支持各种不同模式之间的转换,比如 L
和 RGB
模式。为了转成其他的模式,需要用一张中间模式图像,典型的为 RGB 图片。
读取图像
Image.open() 方法是用来打开一个图片文件的。大多数情况下可以简单的将图像文件名作参数传入:
im = Image.open('lena.jpg')
正常返回结果是一个 PIL.Image.Image 实例。否则会抛出 IOErro r错误。
你可以传入一个类文件代替文件名。这个类文件必须实现 read(),seek(),tell() 方法,并且以二进制模式打开。
从文件读取
fp = open('lena.jpg', 'rb')
im = Image.open(fp)
从 base64 中读取
from PIL import Image
from io import BytesIO
import base64
data['img'] = '''R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw=='''
im = Image.open(BytesIO(base64.b64decode(data)))
im.show()
从网络中读取
# import StringIO # Python 2 可以使用
from PIL import Image
import requests
import io
r = requests.get('https://blog-1252208501.cos.ap-beijing.myqcloud.com/20180703210706.png')
im = Image.open(io.BytesIO(r.content))
# im = Image.open(StringIO.StringIO(r.content)) # Python 2 可以使用
im.show()
从压缩包读取
为示范,先将一些文件例如“lena.jpg”和“niko.gif”打包,压缩包名假设为“Imaging.tar”。从压缩包中读取“lena.jpg”可使用 TarIO.TarIO()
方法获取图片,并交由 Image.open() 处理。
from PIL import Image, TarIO
fp = TarIO.TarIO('Imaging.tar', 'lena.jpg')
im = Image.open(fp)
注意:对 zip 压缩包进行操作时可能会出现解码错误。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:PIL 基本用法2
文章字数:995
本文作者:Bin
发布时间:2018-08-09, 17:57:22
最后更新:2019-08-06, 00:07:35
原始链接:http://coolview.github.io/2018/08/09/Python/PIL-%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%952/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。