将PIL图像转换为字节数组?

Eve*_*eba 44 python image bytearray python-imaging-library

我有一个PIL图像格式的图像.我需要将其转换为字节数组.

img = Image.open(fh, mode='r')  
roiImg = img.crop(box)
Run Code Online (Sandbox Code Playgroud)

现在我需要roiImg作为字节数组.

Eve*_*eba 102

谢谢大家的帮助.

终于解决了!!

import io

img = Image.open(fh, mode='r')
roiImg = img.crop(box)

imgByteArr = io.BytesIO()
roiImg.save(imgByteArr, format='PNG')
imgByteArr = imgByteArr.getvalue()
Run Code Online (Sandbox Code Playgroud)

有了这个,我不必将裁剪后的图像保存在硬盘中,我可以从PIL裁剪图像中检索字节数组.

  • 对于“format =“jpg””,保存到字节不起作用,而“jpeg”适用于文件和字节,而“jpg”仅适用于文件。 (7认同)
  • 你能添加导入io吗? (3认同)
  • @Mooncrater我相信它是这样的:`stream = io.BytesIO(img_byte_array)`然后`img = Image.open(stream)` (2认同)

Chr*_*van 9

我认为您可以简单地调用 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())
Run Code Online (Sandbox Code Playgroud)

  • 从文档 https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.tobytes 来看,不推荐使用它,因为它保存每个像素的原始图像数据。如果您使用 PNG、JPG 等,则需要在 Image.save() 中使用 BytesIO() (10认同)

Nor*_*ori 8

这是我的解决方案。请使用此功能。

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
Run Code Online (Sandbox Code Playgroud)