Python Pillow 库 Image 模块 构建图像 、 图像处理 与 Image对象方法

一、构建图像

PIL.Image.new(mode, size, color=0) 构建一个新图像

参数:

  • mode – 模式,RGB, RGBA, L 等
  • size – 图片大小,(width,height)
  • color – 颜色,默认黑色。单波段图像传入integer或floating值;多波动图像可以时一个元组,创建RGB图像时可以使用 ImageColor 中的颜色字符串。如果color=None,则不初始化图像。

示例:创建红色 RGB 图像

from PIL import Image,ImageColor
im = Image.new('RGB', (200, 200), color="red")
im.show()


PIL.Image.fromarray(obj,mode=None) 将序列转换为图像

参数:

  • obj – 数组接口对象
  • mode – 图片的模式,不给出自动判断

示例1:根据二维数组创建灰度图像

from PIL import Image
import numpy as np
arr = (np.eye(300)*255) # 二维数组
im = Image.fromarray(arr)   # 转换为图像
im.show()

输出结果:

示例2:使用 fromarray 将图像灰度化

from PIL import Image
import numpy as np
image = Image.open("test.jpg")
image1 = image.resize((60, 60))  # 重置图片大小
data = image1.getdata()  # 将图像转换为数组序列
print(list(data))  # 查看具体数据需要使用 list() 转换
obj = []
for t in data:
    obj.append([sum(t) / 3])  # 灰度方法:RGB三个分量的均值
# 变成,60 * 60 的二维数组
obj = np.array(obj).reshape((60, 60))
print(obj)
im = Image.fromarray(obj)
im.show()


PIL.Image.frombytes(mode,size,data,decoder_name='raw',*args) 根据二进制数据创建图像

注意:data 数据格式为字符串,使用 StringIO 对其进行包装并用 open 函数载入它。

参数:

  • mode – 模式
  • size – 图片大小,(width,height)
  • data – 二进制数据
  • decoder_name – 解码器
  • args – 解码器的附加参数

示例:

from PIL import Image
image_width, image_height = 30, 30
# 填充占位数据
image_bytes = bytearray([0x70, 0x70, 0x70]) * image_width * image_height




    

i = 0
# 设置颜色渐变
for y in range(image_height):
    for x in range(image_width):
        image_bytes[i] = int(255.0 * (x / image_width))  # R
        image_bytes[i + 1] = int(255.0 * (y / image_height))  # G
        image_bytes[i + 2] = 0  # B
        i += 3
image = Image.frombytes('RGB', (image_width, image_height), bytes(image_bytes))
image.show()


PIL.Image.frombuffer(mode,size,data,decoder_name='raw',*args) 根据 data 数据创建图像,与 frombytes 类似。不支持所有模式,支持的模式,“L”,“RGBX”,“RGBA”和“CMYK”

注意:如果是整张字符串格式的图片,使用 StringIO 对其进行包装并用 open 函数载入它。

参数:

  • mode – 模式
  • size – 图片大小,(width,height)
  • data – 数据
  • decoder_name – 解码器
  • args – 解码器的附加参数。使用默认解码器 'raw',需提供完整的参数集:
frombuffer(mode, size, data, "raw", mode, 0, 1)

示例:

from PIL import Image
image_width, image_height = 30, 30
# 填充占位数据
image_bytes = bytearray([0x70, 0x70, 0x70]) * image_width * image_height
i = 0
# 设置颜色渐变
for y in range(image_height):
    for x in range(image_width):
        image_bytes[i] = int(255.0 * (x / image_width))  # R
        image_bytes[i + 1] = int(255.0 * (y / image_height))  # G
        image_bytes[i + 2] = 0  # B
        i += 3
# 注意这里与 frombytes 的不同,无后面四个参数会出现警告信息
image = Image.frombuffer('RGB', (image_width, image_height), bytes(image_bytes), 'raw', 'RGB', 0, 1)
image.show()

二. 图像处理

PIL.Image.alpha_composite(im1,im2) 降m2融合到m1上,都必须是 RGBA 模式。

原理:im1 为底,im2 遮住 im1,在im2 透明的部位显示出 im1 的图像。

注意: im1,im2 大小必须一样,mode 必须都为 RGBA 。

示例:

from PIL import Image
im1 = Image.open('Python-logo.png')  # python 官网的logo
im2 = Image.new("RGBA", im1.size, "#000000")
im3 = Image.alpha_composite(im2, im1) # 能看到 im2 的黑色背景
im3.show()


PIL.Image.blend(im1,im2,alpha) 根据 alpha 值融合,公式如下:

out = image1 * (1.0 - alpha) + image2 * alpha

参数:

  • im1 im2 – 大小和 mode 必须相同,mode 可以不是 RGBA 。
  • alpha – alpha= 0.0 返回 im1 图像,alpha= 1.0 返回 im2 图像。alpha 没严格要求,最好将他的值设置在合理范围。

示例:

from PIL import Image
im1 = Image.open('Python-logo.png') # python 官网的logo
im2 = Image.new(im1.mode, im1.size, "#000000")
im3 = Image.blend(im1, im2, 0.3)
im3.show()

输出结果:

示例素材图片:


PIL.Image.composite(image1,image2,mask) 使用透明遮罩混合头像,创建复合图像。

原理:

mack 做为蒙版,将 image1 粘贴到 image2 上。
mack 为255时,按 image1 原样 粘贴到 image2 上。
mack 为 0 时,保留 image2 原图像。
中间值将两个图像混合在一起,包括它们的alpha通道。

参数:

  • im1 im2 – 大小和 mode 必须相同,mode 可以不是 RGBA 。
  • mask – 也是图像. mode 必须为 “1”, “L”, 或 “RGBA”。并且与 im1 大小相同。

示例:

from PIL import Image
im1 = Image.open('Python-logo.png')  # python 官网的logo
im2 = Image.new(im1.mode, im1.size, "#000000")  # 黑色
im3 = Image.new(im1.mode, im1.size, "#FFFFFF")  # 白色
im4 = Image.composite(im3, im2, im1) #  以 im1 为蒙版,将 im3 粘贴到 im2 上
im4.show()  

得到结果:


PIL.Image.eval(image,*args) 根据传入的函数对图像每个像素进行处理

参数:

  • image – 需处理的图像对象
  • function – 函数对象,有一个整数作为参数

示例:

from PIL import Image
im = Image.new('RGB', (100, 100), '#3399EE')
box = (0, 0, 50, 100)
region = im.crop(box)  # 复制部分图片
region = Image.eval(region, lambda x: x * 2)  # 对像素进行处理
im.paste(region, box)  # 将修改后的图片粘贴回原来位置
im.show()

输出:


PIL.Image.merge(mode,bands) 将一组单通道图像合并成多通道图像

参数:

  • mode – 输出图像的 mode
  • bands – 输出图像中每个通道的序列

示例:将图像的通道值更换

from PIL import Image
im = Image.new('RGB', (100, 100), '#3399EE')
box = (0, 0, 50, 100)
crop_im = im.crop(box)  # 复制部分图像
r, g, b = crop_im.split()  # 分离图像通道
merge_im = Image.merge('RGB', (b, r, g))  # 合并图像通道