【问题标题】:Convert PIL Image to byte array?将 PIL 图像转换为字节数组?
【发布时间】: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 格式相同

标签: python image bytearray python-imaging-library


【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 2017-06-25
      • 1970-01-01
      • 2015-08-16
      • 2013-05-19
      • 2010-09-27
      • 2013-01-14
      相关资源
      最近更新 更多