使用PIL在Django中调整图像大小两次

时间:2009-09-28 05:39:33

标签: python django image-manipulation python-imaging-library

我有一个功能,我试图从request.FILES ['image']两次调整照片大小。我也在使用带有Parser的image.thumbnail()。这在我创建一个缩略图时工作正常,但在我的视图中,如果我再次重复完全相同的事情,它在解析器中失败,通过IOError无法解析图像。我很困惑。我已经在内存中创建了StringIO文件,而不是按原样使用Django的UploadedFile对象,它仍然做同样的事情。非常感谢任何帮助。

假设我想要执行以下两次(使用两种不同的缩略图大小),而不是两次检索URL:

import urllib2
from PIL import Image, ImageFile, ImageEnhance

# create Image instance
file = urllib2.urlopen(r'http://animals.nationalgeographic.com/staticfiles/NGS/Shared/StaticFiles/animals/images/primary/kemps-ridley-sea-turtle.jpg')
parser = ImageFile.Parser()
while True:
    s = file.read(1024)
    if not s:
        break
    parser.feed(s)
image = parser.close()

# make thumbnail
size = (75, 75)
image.thumbnail(size, Image.ANTIALIAS)
background = Image.new('RGBA', size, (255, 255, 255, 0))
background.paste(
    image,
    ((size[0] - image.size[0]) / 2, (size[1] - image.size[1]) / 2))

background.save('copy.jpg')

例如:

image = parser.close()
image2 = parser.close() # Obviously this doens't work
image2 = image # Obviously this doesn't either but you get what I need to do here
# Do 2 thumbnails with only one original source.

...其他代码已被省略......

image.save('copy.jpg')
image2.save('copy.jpg')

3 个答案:

答案 0 :(得分:2)

如果这个工作一次,正如您所说,您检索到的图像就好了。至少有两种不同的方法可以从单个PIL图像中获取多个缩略图。

  1. 您可以使用PIL的resize方法,该方法将返回原始大小的重新调整副本。如果你想保持比例不变,你只需要计算你需要的尺寸。
  2. 使用Image.copy()获取图像的副本。
  3. 像这样:

    original = parser.close()
    ...
    
    thumb1 = original.copy()
    size = (75,75)
    thumb1.thumbnail(size, Image.ANTIALIAS)
    ...
    
    thumb2 = original.copy()
    thumbnail2 = original.resize(size2, Image.ANTIALIAS)
    ...
    

    这样,原件不会被更改,您可以根据需要获得尽可能多的副本。

答案 1 :(得分:2)

比复制原始图像更简单的解决方案是改为调用缩略图(...)之间的文件指针,如下所示:

original.seek(0)

答案 2 :(得分:0)

我假设image = parser.close()IOError失败了。所以ImageFile获取图像数据的方式可能有问题。您是否尝试过从本地文件中读取文件?

  

如果解析器设法解码图像,它将返回Image个对象。   否则,此方法会引发IOError异常。

Source