我正在学习Python和Django。
用户使用forms.ImageField()提供图像。然后我必须处理它,以便创建两个不同大小的图像。
当我提交表单时,Django返回以下错误:
IOError at /add_event/
cannot identify image file
我调用resize函数:
def create_event(owner_id, name, image):
image_thumb = image_resizer(image, name, '_t', 'events', 180, 120)
image_medium = image_resizer(image, name, '_m', 'events', 300, 200)
第二次调用图像调整器时出错:
def image_resizer(image, name, size, app_name, length, height):
im = Image.open(image)
if im.mode != "RGB":
im = im.convert("RGB")
im = create_thumb(im, length, height)
posit = str(MEDIA_ROOT)+'/'+app_name+'/'
image_2 = im
image_name = name + size +'.jpg'
imageurl = posit + image_name
image_2.save(imageurl,'JPEG',quality=80)
url_image='/'+app_name+'/'+image_name
return url_image
版本:
Django 1.3.1
Python 2.7.1
第1.1.7页
我想找出问题所在,但我不知道该怎么办。提前谢谢你!
编辑
我解决了重写函数的问题;现在它批量创建不同的图像:
我调用resize函数:
url_array = image_resizer.resize_batch(image, image_name, [[180,120,'_t'], [300,200,'_m']], '/events/')
所以:
image_thumb = url_array[0]
image_medium = url_array[1]
以及resize函数:
def resize_batch(image, name, size_array, position):
im = Image.open(image)
if im.mode != "RGB":
im = im.convert("RGB")
url_array = []
for size in size_array:
new_im = create_thumb(im, size[0], size[1])
posit = str(MEDIA_ROOT) + position
image_name = name + size[2] +'.jpg'
imageurl = posit + image_name
new_im.save(imageurl,'JPEG',quality=90)
new_url_array = position + image_name
url_array.append(new_url_array)
return url_array
谢谢大家!
我猜那是一个
TemporaryUploadedFile
。。。使用类型(图像)查找此项。我不是百分之百确定上面的代码。。。来自我的两个图像处理类。。。但是试试看。
如果是
InMemoryUploadedFile
,那么您的代码应该可以工作!作为注释中的ilvar asks,什么样的对象是
image
?为了这个答案的目的,我假设Django的file
属性来自远程用户上传的文件。文件上载后,在
ImageField.file
属性中获得的对象是一个TemporaryUploadedFile
对象,它可能表示a file on disk or in memory,具体取决于上载的大小。这个对象的行为很像一个普通的Python file object,所以在您读了一次(制作第一个缩略图)之后,您已经到达了文件的末尾,所以当您再次尝试读它(制作第二个缩略图)时,那里什么也没有,因此IOError
。要制作第二个缩略图,需要seek回到文件的开头。所以你可以加上一行开始你的
image_resizer
函数。但这是不必要的!您遇到这个问题是因为您要求Python图像库为您要创建的每个新缩略图重新读取图像。这是浪费时间:最好只看一次图片,然后创建所有你想要的缩略图。
相关问题 更多 >
编程相关推荐