详解Python PIL Image.frombuffer()方法

  • Post category:Python

Python PIL库中的Image模块中提供了一个frombuffer()静态方法,用来根据给定的像素数据和相应的模式,创建一个图像实例。下面是该方法的详细介绍和两个示例说明:

方法介绍

语法

PIL.Image.frombuffer(mode, size, data, decoder_name='raw', stride=None, flipped=False)

参数说明

  • mode: 图像的模式字符串,包括’L’, ‘RGB’, ‘RGBA’, ‘CMYK’等。
  • size: 图像的大小,如(320, 240)。
  • data: 二进制像素数据,形如\x00\x11\x22\x33...
  • decoder_name: 解码器名称,缺省为’raw’。
  • stride: 行的计数,也就是像素数据中每行的字节数,如果无此参数,则假定为size[0]。
  • flipped: 取值为True或False,在图像上下翻转。

返回值

  • Image实例对象。

示例说明

示例1

from PIL import Image

# 创建一个(200,200)大小,RGB模式的图像
img_data = b'\xff'*3*200*200  # b'\xff'是255的16进制数形如0xff
img = Image.frombuffer('RGB', (200, 200), img_data)
img.show()  # 展示图片

代码中,通过给定模式’RGB’、大小(200,200)和像素数据,使用frombuffer方法创建一个图片实例对象,最后展示图片。

示例2

from PIL import Image, ImageDraw

# 创建一个(300,300)大小,RGB模式的图像
img = Image.new('RGB', (300, 300))

# 创建一个draw对象用来在图片上绘制
draw = ImageDraw.Draw(img)

# 在图片上绘制一个矩形
draw.rectangle([(10,10), (290, 290)], fill=(255,0,0,0))

# 获得图片的像素数据和像素数
img_data = img.tobytes()
num_pixels = 300 * 300

# 更改第一个像素点的数值,这里利用'\x00\x00\x00'表示黑色的像素点
img_data = b'\x00\x00\x00' + img_data[3:]

# 创建一个新图像
new_img = Image.frombuffer('RGB', (300, 300), img_data)

# 显示结果
img.show()
new_img.show()

代码中,首先通过Image模块创建了一个(300,300)大小,RGB模式的空白图像;然后根据这个图像创建一个draw对象用来在图片上绘制,绘制完后得到该图像的像素数据img_data和像素数num_pixels;接着,将第一个像素点的数值更改,这里利用\x00\x00\x00表示黑色的像素点,同时通过frombuffer方法创建了一个新图像new_img,最后展示所有图像。