我从某个地方收到一个包含图片的缓冲区(下面是image_data
),我想从该缓冲区生成一个缩略图。
我在考虑使用PIL(嗯,Pillow),但没有成功。这是我尝试过的:
>>> image_data
<read-only buffer for 0x03771070, size 3849, offset 0 at 0x0376A900>
>>> im = Image.open(image_data)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "<path>\PIL\Image.py", line 2097, in open
prefix = fp.read(16)
AttributeError: 'buffer' object has no attribute 'read'
>>> image_data.thumbnail(50, 50)
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'buffer' object has no attribute 'thumbnail'
>>>
我确信有一种简单的方法可以解决这个问题,但我不确定如何解决这个问题。
答案 0 :(得分:4)
将缓冲区转换为StringIO,它具有Image.open()所需的所有文件对象的方法。您甚至可以使用更快的cStringIO:
from PIL import Image
import cStringIO
def ThumbFromBuffer(buf,size):
im = Image.open(cStringIO.StringIO(buf))
im.thumbnail(size, Image.ANTIALIAS)
return im
答案 1 :(得分:2)
为了完整起见,以下是我的代码最终结果(感谢您的帮助)。
def picture_small(request, pk):
try:
image_data = Person.objects.get(pk=pk).picture
im = Image.open(cStringIO.StringIO(image_data))
im.thumbnail((50, 70), Image.ANTIALIAS)
image_buffer = cStringIO.StringIO()
im.save(image_buffer, "JPEG")
response = HttpResponse(image_buffer.getvalue(), content_type="image/jpeg")
return response
except Exception, e:
raise Http404
使用Django 1.6。