You must open the file in binary mode, otherwise it will write something but file may be corrupted. According to the test you do, the file will be corrupted or not, that may not be because of the crop itself.
Here is a working version I made:
from PIL import Image
#from StringIO import StringIO
img = Image.open("foobar.png")
img = img.crop( (0,0,400,400) )
img.thumbnail([200, 200], Image.ANTIALIAS)
file_destination='quux.png'
# imagefile = StringIO()
imagefile = open(file_destination, 'wb')
try:
img.save(imagefile, "png", quality=90)
imagefile.close()
except:
print "Cannot save user image"