2014-07-20 4 views
2

두 개의 이미지가있는 양식을 만들고 싶습니다. 첫 번째는 원본 사진의 크기이고 두 번째는 축소판입니다. 두 개의 다른 디렉토리에 이미지를 저장하고 싶습니다. 내가하고있는 일이지만 엄지 손톱을 저장할 수 없다.장고에서 업로드시 두 개의 이미지 크기 재조정

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) 
관련 문제