2017-03-18 110 views
0

我试图通过使用thumbnail()/resize()函数调整图像的大小,我知道这个thumbnail()返回NoneType,因为它确实是魔法并且不会创建副本。我已经尝试了几个选项: 注:我不想将其保存到本地,这会被发送到s3PIL调整大小图像返回NoneType

original_image是filestorage,它是从一个form到来。

尝试1:

from PIL import Image 
from io import BytesIO 

def resize_img(original_image, size): 
    sizes = { 
     'thumbnail': (128, 128), 
     'medium': (640, 640), 
     'large': (1024, 1024) 
    } 

    im = Image.open(BytesIO(original_image.read())) 
    return im.thumbnail(sizes[size], Image.ANTIALIAS) 

回报NoneType并不能使用它。有没有办法让它返回可用的东西?

尝试2:

wpercent = (sizes[size]/float(im.size[0])) 
hsize = int((float(im.size[1])*float(wpercent))) 
return im.resize((sizes[size], hsize), Image.ANTIALIAS) 

返回<class 'PIL.JpegImagePlugin.JpegImageFile'>boto3抱怨说,这Fileobj must implement read

什么是我选择这里?

+0

['.thumbnail()'](http://pillow.readthedocs.io/en/4.0.x/reference/Image.html#PIL.Image.Image.thumbnail)确实对图像进行了原地修改并按照记录返回'None'。 “*如果您还需要使用全分辨率图像,请将此方法应用于原始图像的副本()*” – dhke

+0

@dhke这就是我上面所说的。问题是;如何在调整大小后创建新图像,以便稍后使用。 – Leustad

+0

['.copy()'](http://pillow.readthedocs.io/en/4.0.x/reference/Image.html#PIL.Image.Image.copy)?看到(现在)引用了文档的摘录;-) – dhke

回答

1

下面是我如何提出解决方案。由于@jasonharper

def resize_img(original_image, size): 
    sizes = { 
     'thumbnail': (128, 128), 
     'medium': (640, 640), 
     'large': (1024, 1024) 
    } 

    im = Image.open(BytesIO(original_image.read())) 
    img = im.copy() 

    img.thumbnail(sizes[size], Image.ANTIALIAS) 
    byte_io = BytesIO() 
    img.save(byte_io, 'JPEG') 
    byte_io.seek(0) 
    return byte_io 

此解决方案和boto3不抱怨为好。