Python PIL以二进制模式将图像保存到内存中

时间:2015-12-30 02:48:49

标签: python

我正在从URL中读取图像文件并使用PIL为其添加水印。然后我需要将处理后的图像上传到FTP服务器。但成功上传后,我只看到一个损坏的图像(空白中的“?”)。 FTP服务器需要二进制模式上传。但我想我已经在使用二进制模式了。我有以下代码:

from PIL import Image
import ftplib
import urllib2
import StringIO

try:
    img_file = urllib2.urlopen(img_url)
except Exception, e:
    print 'Warn: image cannot be downloaded

# get the image as file in memory and make video
try:
    im = Image.open(img_file)
except Exception, e:
    print 'Warn: image not valid

# paste_im = Image.open("../asset/logo.png")
# if paste_im is None:
#     print 'Error: paste_im is None'
#     return
# im = watermark(im, paste_im, position=(20, 16), opaque=0.5)

id = 'myID'
pw = 'myPw'
output = StringIO.StringIO()
im.save(output, format='JPEG')
try:
    session = ftplib.FTP('FTP_server_url', id, pw)
    session.storbinary('STOR image.jpg', output)
except ftplib.all_errors as e:
        print '%s' % e 
output.close()
session.quit()
print 'upload succeeded'

我后来评论说:

# paste_im = Image.open("../asset/logo.png")
# if paste_im is None:
#     print 'Error: paste_im is None'
#     return
# im = watermark(im, paste_im, position=(20, 16), opaque=0.5)

为了不在这里引入额外的复杂性,但它仍然失败。我想知道在哪一步我可能是错的。

旧代码完美无缺:

img_file = urllib.urlopen(img_url)
try:
    session = ftplib.FTP('FTP_server_url', id, pw)
    session.storbinary('STOR image.jpg', img_file)
except ftplib.all_errors as e:
    print 'error'
img_file.close()
session.quit()

但现在我需要先将它传递给PIL进行一些处理。非常感谢。

1 个答案:

答案 0 :(得分:1)

正如Klaus指出的那样,im.save(output, format='JPEG'会将写指针设置为文件的末尾,因此下一次读取(此处为storbinary)将返回0字节。所以我们应该在读取之前添加output.seek(0)来回放文件对象。