2012-06-05 38 views
3

我使用PIL使用這種方法來調整上載文件的Django:調整大小上傳的文件中使用PIL

def resize_uploaded_image(buf): 
    imagefile = StringIO.StringIO(buf.read()) 
    imageImage = Image.open(imagefile) 

    (width, height) = imageImage.size 
    (width, height) = scale_dimensions(width, height, longest_side=240) 

    resizedImage = imageImage.resize((width, height)) 
return resizedImage 

然後我用這個方法來獲取resizedImage在我的主要觀點方法:

image = request.FILES['avatar'] 
resizedImage = resize_uploaded_image(image) 
content = django.core.files.File(resizedImage) 
acc = Account.objects.get(account=request.user) 
acc.avatar.save(image.name, content) 

但是,這給了我'讀'錯誤。

跟蹤:

異常類型:AttributeError的在/ MyApp的/ editAvatar異常值: 讀

任何想法如何解決這一問題?我已經呆了好幾個小時了! 謝謝!

Nikunj

+0

PIL圖像對象不是文件。您需要先使用某種編碼(例如PNG)將'save()'保存到一個StringIO對象。在將文件寫入到StringIO之後,不要忘記「尋找(0)」!附註:爲什麼不直接從'buf'讀取並避免額外的包裝StringIO? – Cameron

+0

卡梅隆,謝謝你的回覆。我對此很新。我不明白髮生了什麼事。我正在拼湊片段以使其工作。如何保存到一個StringIO對象。將resizedImage.save()。seek(0)放在最上面的方法是否足夠好?如果你可以給我看一些示例代碼或者這裏有記錄的地方,那會很棒:)謝謝。 – nknj

+0

由於您似乎關心調整化身的大小,這是非常常見和標準的事情:與直接使用像easy_thumbnails(也使用PIL的專用應用程序)一起使用PIL調整圖像大小可能會使事情變得更加簡單:http:/ /easy-thumbnails.readthedocs.org/en/latest/usage/#python – arie

回答

4

這裏是你如何採取一個類文件對象,操作它在PIL的圖像,然後把它放回一個類似文件的對象:

def resize_uploaded_image(buf): 
    image = Image.open(buf) 

    (width, height) = image.size 
    (width, height) = scale_dimensions(width, height, longest_side=240) 

    resizedImage = image.resize((width, height)) 

    # Turn back into file-like object 
    resizedImageFile = StringIO.StringIO() 
    resizedImage.save(resizedImageFile , 'PNG', optimize = True) 
    resizedImageFile.seek(0) # So that the next read starts at the beginning 

    return resizedImageFile 

注意,有已經是一個方便的thumbnail()方法PIL圖像。這是我在自己的項目中使用的縮略圖代碼的變體:

def resize_uploaded_image(buf): 
    from cStringIO import StringIO 
    import Image 

    image = Image.open(buf) 

    maxSize = (240, 240) 
    resizedImage = image.thumbnail(maxSize, Image.ANTIALIAS) 

    # Turn back into file-like object 
    resizedImageFile = StringIO() 
    resizedImage.save(resizedImageFile , 'PNG', optimize = True) 
    resizedImageFile.seek(0) # So that the next read starts at the beginning 

    return resizedImageFile 
+0

謝謝Cameron! – nknj

1

這將是更好地爲您保存上傳的圖像,然後顯示在模板調整其大小如你所願。這樣你就可以在運行時調整圖像大小。 sorl-thumbnail是djano應用程序,您可以使用它進行模板圖像大小調整,它很容易使用,您也可以在視圖中使用它。這裏是examples這個應用程序。