我是Python和Django的新手。我正在尝试为我的一个基于图像的网站调整图像大小。我有一个实际渲染所有图像的视图,这些图像使用基本宽度进行重新调整,如下所示。
import PIL
from PIL import Image,ImageDraw, ImageFont, ImageEnhance
def showphoto(request,template = 'base.html',page_template = 'photo/showphoto.html'):
basewidth = 300
photos = Photo.objects.order_by('-uploaded_time')
img = Image.open(photos)
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
photo_list=img.save(photos)
context = {}
context.update({
'photo_list': photo_list,
'page_template': page_template,
})
if request.is_ajax():
template = page_template
return render_to_response(template,context,context_instance=RequestContext(request))
但是我正面临一个错误......
AttributeError at /showphoto/
'QuerySet' object has no attribute 'read'
这是我的照片模型..
class Photo(models.Model):
name = models.CharField(max_length = 100)
photo = models.ImageField(upload_to = 'photos', blank=False,null=True)
approved = models.BooleanField(default = False)
uploaded_time = models.DateTimeField()
description = models.CharField(max_length = 80 , blank = False , null = True)
keyword = models.CharField(max_length = 200 , blank = False , null = True)
image_id = models.CharField(max_length=300, blank=True, null=True)
Certified = models.BooleanField(default = False)
approved_by = models.CharField(max_length = 100)
user = models.ForeignKey(User)
total_download = models.IntegerField(default=0)
watermarked_image = models.ImageField(upload_to = 'temp', blank=True,null=True)
现在问题是什么,请仔细查看我的代码。
答案 0 :(得分:2)
首先,由于你是Python和Django的新手,最好从Pillow而不是Pil开始,因为它基本上没有维护,Pillow是自Django 1.6以来的首选库。
其次,在视图中调整图像大小并不是首选方法。此外,您每次都在调整图像大小。更常见的方法是使用sorl-thumbnail等模板标签。
至于特定错误,正如Platinum Azure所说,您将查询集实例传递给需要文件对象或路径的函数。如果你想继续你的方法,你可以迭代你的查询集(没有测试!):
# Outside your view
def resize_photo(photo):
img = Image.open(photo)
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
img.save()
return img
# In your view
photo_list = [resize_photo(p.photo) for p in photos]
答案 1 :(得分:0)
您似乎将图像的查询集视为单个图像。您可能需要迭代结果并一次处理一个图像。
错误来自于您通过将查询集发送到Image.open()
来将其视为类文件对象。只有当你试图获取有关图像的信息时,图书馆才会尝试阅读"文件"只是为了发现它并不是最终的,因为它没有' t实现read
方法。