2014-10-31 60 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