47
votes

I am writing a Python script where I want to do bulk photo upload. I want to read an Image and convert it into a byte array. Any suggestions would be greatly appreciated.

#!/usr/bin/python
import xmlrpclib
import SOAPpy, getpass, datetime
import urllib, cStringIO
from PIL import Image
from urllib import urlopen 
import os
import io
from array import array
""" create a proxy object with methods that can be used to invoke
    corresponding RPC calls on the remote server """
soapy = SOAPpy.WSDL.Proxy('localhost:8090/rpc/soap-axis/confluenceservice-v2?wsdl') 
auth = soapy.login('admin', 'Cs$corp@123')
4
why would you want that? how would that help you to upload? theres not enough data for a meaningful answer - WeaselFox
@WeaselFox : I want to read an Image file and convert it into Byte array. - Akash Bhardwaj
#pictureData = xmlrpclib.Binary(open('C:/BulkPhotoUpload/UserPhotos/admin.png').read()).decode('utf-8') url = 'C:/BulkPhotoUpload/UserPhotos/admin.png' pictureData = unicode(str(open(url,"rb"))) print type(pictureData) profilePictureAdded = soapy.addProfilePicture(auth, 'admin', 'avatar.png', 'image/png', pictureData) if profilePictureAdded: print "Successfully added new profile picture..." else: print "Failed to add new profile picture..." - Akash Bhardwaj
@WeaselFox I was looking this question to my odoo module. I upload an image to an S3 and I wanted to create a thumbnail on the fly, thanks to this question I can :) - fnaquira

4 Answers

64
votes

Use bytearray:

with open("img.png", "rb") as image:
  f = image.read()
  b = bytearray(f)
  print b[0]

You can also have a look at struct which can do many conversions of that kind.

13
votes

i don't know about converting into a byte array, but it's easy to convert it into a string:

import base64

with open("t.png", "rb") as imageFile:
    str = base64.b64encode(imageFile.read())
    print str

Source

11
votes

This works for me

# Convert image to bytes
import PIL.Image as Image
pil_im = Image.fromarray(image)
b = io.BytesIO()
pil_im.save(b, 'jpeg')
im_bytes = b.getvalue()
return im_bytes
6
votes
with BytesIO() as output:
    from PIL import Image
    with Image.open(filename) as img:
        img.convert('RGB').save(output, 'BMP')                
    data = output.getvalue()[14:]

I just use this for add a image to clipboard in windows.