PIL 基本用法2

PIL 基本用法

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

剪切、粘贴、合并图像

https://lizonghang.github.io/2016/07/05/快速入门PIL/

从图像中复制出一个矩形选区

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 库支持各种不同模式之间的转换,比如 LRGB 模式。为了转成其他的模式,需要用一张中间模式图像,典型的为 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 中读取

https://stackoverflow.com/questions/26070547/decoding-base64-from-post-to-use-in-pil/26079673#26079673

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" 转载请保留原文链接及作者。

目录