2014-10-31 68 views
0

我重写的ModelAdmin的save_model方法将图像尺寸调整到其正在通过管理页面上传650:Django的Python的PIL保存图像 - 破碎的形象

def save_model(self, request, obj, form, change): 
    basewidth = 650 
    img = PIL.Image.open(form.cleaned_data['image_file']) 

    if img.size[0] > basewidth: 
     wpercent = (basewidth/float(img.size[0])) 
     hsize = int((float(img.size[1]) * float(wpercent))) 
     img = img.resize((basewidth, hsize), PIL.Image.ANTIALIAS) 

     img_filefield = getattr(obj, 'image_file') 
     random_image_name = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(30)) + '.jpeg' 
     img.save(random_image_name) 
     img_filefield.save(random_image_name, ContentFile(img)) 
     obj.save() 
    else: 
     obj.save() 

它是保存图像,但图像如果我打开它,只是一个黑色的图像"invalid image"

我在做什么错在上面的代码?

回答

0

我不知道PIL图像是不同于Django ImageField类型的类型。由于Skitz的answer,我可以解决这个问题是这样的:

def save_model(self, request, obj, form, change): 
    basewidth = 650 
    img = PIL.Image.open(form.cleaned_data['image_file']) 

    if img.size[0] > basewidth: 
     wpercent = (basewidth/float(img.size[0])) 
     hsize = int((float(img.size[1]) * float(wpercent))) 
     img = img.resize((basewidth, hsize), PIL.Image.ANTIALIAS) 

     img_file_lang = getattr(obj, 'image_file') 
     random_image_name = ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(30)) + '.jpeg' 

     image_io = StringIO.StringIO() 
     img.save(image_io, format='JPEG') 

     img_file_lang.save(random_image_name, ContentFile(image_io.getvalue())) 
     obj.save() 
    else: 
     obj.save() 

不要忘记做:import StringIO