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

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

我有一个函数,我试图通过 request.FILES['image'] 两次调整照片的大小。我也将 image.thumbnail() 与解析器一起使用。这在我创建一个缩略图时工作正常,但在我看来,如果我再次重复完全相同的事情,它会通过 IOError cannot parse image 在解析器中失败。我很困惑。我在内存中创建了 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')

最佳答案

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

  1. 您可以使用 PIL 的 resize 方法,该方法将返回原始文件的大小调整后的副本。如果您想保持比例不变,您只需计算所需的尺寸即可。
  2. 使用 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)
...

这样,原件不会被更改,您可以根据需要获得任意数量的副本。

关于python - 使用 PIL 在 Django 中调整图像大小两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1485569/

相关文章:

python - 多个处理器记录到同一个旋转文件

javascript - Django:在 Javascript 中启用翻译的简单方法?

django - 我可以在哪里为 twitter 获取 access_token 和 token_secret

java - 如何用java把一张图片一分为二

python - 如何在sklearn k-means聚类中将具有较大点数的组标记为 ‘0’

python - 使用列表作为格式字符串的值,而不必单独列出每个项目

python - 使用时出错 include ('admin.site.urls' ) : Passing a 3-tuple to include() is not supported

python - 如何获取查询集的不同值?

javascript - 通过 Javascript/CSS 翻转 html/图像的跨浏览器方式?

c++ - 将并行 CUDA 程序转换为顺序运行