将 PIL 图像转换为字节数组?
Posted
技术标签:
【中文标题】将 PIL 图像转换为字节数组?【英文标题】:Convert PIL Image to byte array? 【发布时间】:2016-01-11 03:51:16 【问题描述】:我有一张 PIL 图像格式的图像。我需要将其转换为字节数组。
img = Image.open(fh, mode='r')
roiImg = img.crop(box)
现在我需要 roiImg
作为字节数组。
【问题讨论】:
请提供更多细节。字节数组应该采用什么格式?原始像素值可通过Image.getdata()
获得,它返回 PIL 用于特定平台上特定格式图像的内部表示。
不确定,但听起来你需要使用Image
的getdata()
方法。
我的目标是将图像保存在 mysql 数据库中作为 BLOB 类型。
imgByteArr = open("foo.png" 'rb').read()
需要roiImg
与imgByteArr
格式相同
【参考方案1】:
感谢大家的帮助。
终于解决了!!
import io
img = Image.open(fh, mode='r')
roi_img = img.crop(box)
img_byte_arr = io.BytesIO()
roi_img.save(img_byte_arr, format='PNG')
img_byte_arr = img_byte_arr.getvalue()
有了这个,我不必将裁剪的图像保存在我的硬盘中,我可以从 PIL 裁剪的图像中检索字节数组。
【讨论】:
感谢您提供此示例!我只是想做同样的事情。 可以添加import io吗? 对于format="jpg"
保存到字节不起作用,而 "jpeg"
适用于文件和字节,"jpg"
仅适用于文件。
我该如何做相反的事情?有什么想法吗?【参考方案2】:
这是我的解决方案。请使用此功能。
from PIL import Image
import io
def image_to_byte_array(image:Image):
imgByteArr = io.BytesIO()
image.save(imgByteArr, format=image.format)
imgByteArr = imgByteArr.getvalue()
return imgByteArr
【讨论】:
【参考方案3】:我认为您可以简单地调用 PIL 图像的 .tobytes()
方法,然后从那里将其转换为数组,使用内置的 bytes
。
#assuming image is a flattened, 3-channel numpy array of e.g. 600 x 600 pixels
bytesarray = bytes(Image.fromarray(array.reshape((600,600,3))).tobytes())
【讨论】:
来自文档pillow.readthedocs.io/en/stable/reference/… 不推荐使用它,因为它保存每个像素的原始图像数据。如果您使用 PNG、JPG 等。然后需要在 Image.save() 中使用 BytesIO() 啊,我明白了。出于我的目的,我不需要字节数据,因为我立即对 RBG 值进行数值处理。此外,这个问题没有提到任何关于保存图像的内容,只是转换它们。考虑出于这个原因删除您的反对票。【参考方案4】:Python文件读取并提取二进制数组
import base64
with open(img_file_name, "rb") as f:
image_binary = f.read()
base64_encode = base64.b64encode(image_binary)
byte_decode = base64_encode.decode('utf8')
【讨论】:
以上是关于将 PIL 图像转换为字节数组?的主要内容,如果未能解决你的问题,请参考以下文章