Reputation: 4541
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.
Upvotes: 144
Views: 210022
Reputation: 4541
Thanks everyone for your help.
Finally got it resolved!!
import io
from PIL import Image
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.
Upvotes: 307
Reputation: 3022
This is my solution:
from PIL import Image
import io
def image_to_byte_array(image: Image) -> bytes:
# BytesIO is a file-like buffer stored in memory
imgByteArr = io.BytesIO()
# image.save expects a file-like as a argument
image.save(imgByteArr, format=image.format)
# Turn the BytesIO object back into a bytes object
imgByteArr = imgByteArr.getvalue()
return imgByteArr
Upvotes: 65
Reputation: 5
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')
Upvotes: -6
Reputation: 556
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())
Upvotes: 10