Alright, I'm toying around with converting a PIL image object back and forth to a numpy array so I can do some faster pixel by pixel transformations than PIL's PixelAccess
object would allow. I've figured out how to place the pixel information in a useful 3D numpy array by way of:
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
But I can't seem to figure out how to load it back into the PIL object after I've done all my awesome transforms. I'm aware of the putdata()
method, but can't quite seem to get it to behave.
Best Answer
You're not saying how exactly
putdata()
is not behaving. I'm assuming you're doingThis is because
putdata
expects a sequence of tuples and you're giving it a numpy array. Thiswill work but it is very slow.
As of PIL 1.1.6, the "proper" way to convert between images and numpy arrays is simply
although the resulting array is in a different format than yours (3-d array or rows/columns/rgb in this case).
Then, after you make your changes to the array, you should be able to do either
pic.putdata(pix)
or create a new image withImage.fromarray(pix)
.