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

Python 使用PIL在Django中调整图像大小两次,python,django,image-manipulation,python-imaging-library,Python,Django,Image Manipulation,Python Imaging Library,我有一个函数,在这个函数中,我试图从request.FILES['image']两次调整照片的大小。我还将image.缩略图与解析器一起使用。当我创建一个缩略图时,这可以很好地工作,但在我看来,如果我再次重复完全相同的事情,它将在解析器中失败,因为IOError无法解析图像。我很困惑。我在内存中创建了StringIO文件,而不是像现在一样使用Django的UploadedFile对象,它仍然做同样的事情。非常感谢您的帮助 假设我想使用两种不同的缩略图大小执行以下两次操作,而无需检索URL两次:

我有一个函数,在这个函数中,我试图从request.FILES['image']两次调整照片的大小。我还将image.缩略图与解析器一起使用。当我创建一个缩略图时,这可以很好地工作,但在我看来,如果我再次重复完全相同的事情,它将在解析器中失败,因为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')

我假设它在image=parser.close行上失败,并出现IOError。因此,ImageFile获取图像数据的方式可能有问题。您是否尝试过从本地文件进行读取

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


.

我假设它在image=parser.close行上失败,并出现IOError。因此,ImageFile获取图像数据的方式可能有问题。您是否尝试过从本地文件进行读取

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


.

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

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

original = parser.close()
...

thumb1 = original.copy()
size = (75,75)
thumb1.thumbnail(size, Image.ANTIALIAS)
...

thumb2 = original.copy()
thumbnail2 = original.resize(size2, Image.ANTIALIAS)
...

这样,原稿就不会被更改,您可以获得所需的任意多份副本。

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

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

original = parser.close()
...

thumb1 = original.copy()
size = (75,75)
thumb1.thumbnail(size, Image.ANTIALIAS)
...

thumb2 = original.copy()
thumbnail2 = original.resize(size2, Image.ANTIALIAS)
...

这样,原始图像将不会被更改,您可以获得所需的任意多份副本。

比复制原始图像更简单的解决方案是在调用缩略图之间重置文件指针。。。像这样:

original.seek(0)

比复制原始图像更简单的解决方案是在调用缩略图之间重置文件指针。。。像这样:

original.seek(0)

谢谢,图片。复印件正是我需要的。我太可笑了,以至于无法向下滚动并注意到文档中的方法,所以我尝试自己克隆UploadedFile对象并重用它:谢谢,image.copy正是我所需要的。我太可笑了,以至于无法向下滚动并注意到文档中的方法,所以我尝试自己克隆UploadedFile对象并重用它: