2014-07-20 22 views
2

我想用兩張圖片製作一張圖片,第一張是原始圖片的大小,第二張是縮略圖,我想將圖片保存在兩個不同的目錄中,這是我在做什麼,但我不能保存縮略圖。在Django中上傳兩張圖片的大小

models.py

class Cakes(models.Model): 
    title = models.CharField(max_length=100, unique=True) 
    descrip = models.TextField(verbose_name='Descripction') 
    imagen = models.ImageField(upload_to='Cake', verbose_name='Imagen') 
    imagen2 = models.ImageField(upload_to='Cake/thumbnail', verbose_name='Imagen2') 
    time_regist = models.DateField(auto_now=True) 

    def __unicode__(self): 
     return self.titulo 

view.py

def new_cake(request): 
    if request.method == 'POST': 
     formulario = CakesForm(request.POST, request.FILES) 
     if formulario.is_valid(): 
      resize_imagen(request.FILES['imagen'],250) 

      resize_imagen(request.FILES['imagen'],960) 

      formulario.save() 
      return HttpResponseRedirect('/paneladmin') 
    else: 
     formulario = CakesForm() 
    return render_to_response('nuevocake.html', {'formulario': formulario}, context_instance = RequestContext(request)) 

def resize_imagen(img, size): 
    import StringIO, os 
    from PIL import Image, ImageOps 
    from django.core.files import File 
    imagenarchivo = StringIO.StringIO(img.read()) 
    imagenImagen = Image.open(imagenarchivo) 
    if size == 250: 
     imagenImagen.thumbnail((250,120), Image.ANTIALIAS) 
    else: 
     imagenImagen.thumbnail((960,720), Image.ANTIALIAS) 
    # re-initialize imageFile 

    imagefile = StringIO.StringIO() 
    imagenImagen.save(imagefile,'JPEG') 

我不想原來的imagen畫質,因爲原始文件是重,這就是爲什麼我想要做一個調整大小。而函數resize_imagen不起作用。

+0

你得到一個消息?日常工作中沒有特別的東西? –

+0

我得到這個錯誤'無法識別圖像文件' – urdaneta88

+0

@ urdaneta88你能告訴我們完整的回溯?用行是錯誤信息指向? – user2719875

回答

1

這是我使用的效用函數,save_thumbnail。我建議將它放在app_name/utils.py

這增加了從數據庫獲取原始圖像(額外查詢...)的功能,以確認圖像在更新縮略圖圖像之前已經更改,以保存PIL處理。

(如果你傳遞force_thumbnail它總是會創建一個沒有獲取原始圖像,看它是否已經改變了自上次保存的縮略圖。)

# models.py 
from django.db import transaction 
import app_name.utils 

class Node(models.Model): 
    # ... 
    image = models.ImageField(upload_to='node_images', null=False) 
    thumbnail_200w = models.ImageField(upload_to='node_images/200w', null=False) 

    def save(self, *args, **kwargs): 
     with transaction.commit_on_success(): 
      # instance_class, self, image_attr, thumbnail_attr, width, height=None 
      cms.utils.save_thumbnail(Node, self, 'image', 'thumbnail_200w', 200, None) 
      super(Node, self).save(*args, **kwargs) 

# utils.py 
from PIL import Image 
from cStringIO import StringIO 
from django.core.files.uploadedfile import SimpleUploadedFile 
import os 

def save_thumbnail(instance_class, instance, image_attr, thumbnail_attr, max_width, max_height=None, force_thumbnail=False): 
    new_image = getattr(instance, image_attr) 
    if not new_image: 
     return 

    if not force_thumbnail: 
     if instance.id: 
      existing_image = getattr(instance_class.objects.get(id=instance.id), image_attr) 
     else: 
      existing_image = None 

     if new_image == existing_image: 
      return # exit because the file hasn't changed, no need to generate thumbs 

    super(instance_class, instance).save() 

    thumbnail = create_thumbnail(getattr(instance, image_attr).file, max_width, max_height) 
    getattr(instance, thumbnail_attr).save(thumbnail.name, thumbnail, save=False) 


def create_thumbnail(original, max_width, max_height=None): 

    # Open original photo which we want to thumbnail using PIL's Image 
    image = Image.open(StringIO(original.read())) 

    # Set our max thumbnail size in a tuple (max width, max height) 
    if max_height: 
     THUMBNAIL_SIZE = (max_width, max_height) 
     image.thumbnail(THUMBNAIL_SIZE, Image.ANTIALIAS) 
    else: 
     # scale to width, keeping aspect 
     width_ratio = (max_width/float(image.size[0])) 
     hsize = int((float(image.size[1]) * float(width_ratio))) 
     THUMBNAIL_SIZE = (max_width, hsize) 
     image = image.resize(THUMBNAIL_SIZE, Image.ANTIALIAS) 

    DJANGO_TYPE = original.file.content_type 

    if DJANGO_TYPE == 'image/jpeg': 
    PIL_TYPE = 'jpeg' 
    FILE_EXTENSION = 'jpg' 
    elif DJANGO_TYPE == 'image/png': 
    PIL_TYPE = 'png' 
    FILE_EXTENSION = 'png' 
    elif DJANGO_TYPE == 'image/gif': 
    PIL_TYPE = 'gif' 
    FILE_EXTENSION = 'gif' 


    # Save the thumbnail 
    temp_handle = StringIO() 
    image.save(temp_handle, PIL_TYPE) 
    temp_handle.seek(0) 

    # Save image to a SimpleUploadedFile which can be saved into ImageField 
    return SimpleUploadedFile(os.path.split(original.name)[-1], 
     temp_handle.read(), content_type=DJANGO_TYPE)