将 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 用于特定平台上特定格式图像的内部表示。 不确定,但听起来你需要使用Imagegetdata()方法。 我的目标是将图像保存在 mysql 数据库中作为 BLOB 类型。 imgByteArr = open("foo.png" 'rb').read() 需要roiImgimgByteArr 格式相同 【参考方案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 图像转换为字节数组?的主要内容,如果未能解决你的问题,请参考以下文章

PIL(Pillow)的学习笔记

将图像控件转换为字节数组 Asp.Net

将字节数组转换/显示为 bmp/jpeg 图像

如何仅使用 javascript 将图像转换为字节数组以将图像存储在 sql server 上?

使用 Rails 将字节数组转换为 HTML 图像?

如何将字节数组转换为blob