2017-03-18 148 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不抱怨爲好。