78
votes

I have an image in PIL Image format. I need to convert it to byte array.

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

Now I need the roiImg as a byte array.

4
Please supply more detail. In what format is the byte array supposed to be? The raw pixels values are available via Image.getdata(), which returns the internal representation PIL uses for an image in a particular format on a particular platform. - dhke
Not sure, but it sounds like you need to use theImage's getdata() method. - martineau
My objective is to save the image in mysql database as a BLOB type. - Evelyn Jeba
imgByteArr = open("foo.png" 'rb').read() Need roiImg in the same format as imgByteArr - Evelyn Jeba

4 Answers

184
votes

Thanks everyone for your help.

Finally got it resolved!!

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()

With this i don't have to save the cropped image in my hard disc and I'm able to retrieve the byte array from a PIL cropped image.

27
votes

This is my solution.Please use this function.

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
2
votes

I think you can simply call the PIL image's .tobytes() method, and from there, to convert it to an array, use the bytes built-in.

#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())
-1
votes

Python file read and extract binary array

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')