2011-07-21 111 views
2

トリミングされた画像からさらにサイズ変更された画像を取得する際に問題があります。私はdjango-cropper 0.1を使用しています。トリミングした画像のための もともとモデルは、このようなコードの一部がありますDjango Cropper - トリミングされた画像から別のサイズ変更された画像を取得する

class Cropped(models.Model): 
    def __unicode__(self): 
     return u'%s-%sx%s' % (self.original, self.w, self.h) 

    def upload_image(self, filename): 
     return '%s/crop-%s' % (settings.ROOT, filename) 

    def save(self, *args, **kwargs): #force_insert=False, force_update=False, using=None): 
     source = self.original.image.path 
     target = self.upload_image(os.path.basename(source)) 

     Image.open(source).crop([ 
      self.x,    # Left 
      self.y,    # Top 
      self.x + self.w, # Right 
      self.y + self.h  # Bottom 
     ]).save(django_settings.MEDIA_ROOT + os.sep + target) 


     self.image = target   
     super(Cropped, self).save(*args, **kwargs) 

をしかし、私は、私は、コードを少し変更するので、トリミングされた画像から、追加のリサイズ画像を持つようにしたいと、今ではそのようになっています

class Cropped(models.Model): 
    def __unicode__(self): 
     return u'%s-%sx%s' % (self.original, self.w, self.h) 

    def _get_average_path(self): 
     return _add_average(self.path) 
    average_path = property(_get_average_path) 

    def _get_average_url(self): 
     return _add_average(self.url) 
    average_url = property(_get_average_url) 

    def _get_large_path(self): 
     return _add_large(self.path) 
    large_path = property(_get_large_path) 

    def _get_large_url(self): 
     return _add_large(self.url) 
    large_url = property(_get_large_url) 

    def upload_image(self, filename): 
     return '%s/crop-%s' % (settings.ROOT, filename) 

    def save(self, *args, **kwargs): #force_insert=False, force_update=False, using=None): 
     source = self.original.image.path 
     target = self.upload_image(os.path.basename(source)) 

     img = Image.open(source).crop([ 
      self.x,    # Left 
      self.y,    # Top 
      self.x + self.w, # Right 
      self.y + self.h  # Bottom 
     ]).save(django_settings.MEDIA_ROOT + os.sep + target) 

     self.image = target   
     super(Cropped, self).save(*args, **kwargs) 
     img = Image.open(self.image.path) 
     img = img.resize((180, 180), Image.ANTIALIAS) 
     img.save(self.large_path, 'JPEG') 

     img = img.resize((104, 104), Image.ANTIALIAS) 
     img.save(self.average_path, 'JPEG') 

しかしそれはまだ基本的な仕事をしています。誰かが私を助けて、このコードで何を修正すべきですか?

+0

まあ、コード内に追加のバリアントが生成される場所が見つかりません。追加のメソッドを実装しただけですが、呼び出されることはありません。 BTWは、代わりにdjango-cuddlybuddlyのようなテンプレートベースのアプローチを使用しますか?私のために、それはより良い動作します。 – schneck

+0

django-cuddlybuddly?私はそれを見ているが、表示されたページに画像をトリミングする機能はないようだ。多分私は間違っています。それで、あなたは、追加イメージを保存する方法を呼び出すために何をすべきかを教えて、私を助けてくれるでしょうか? – krzyhub

答えて

1

私は解決策を見つけたので、私自身の質問に答えます。たぶん今は最高の解決策ですが、うまくいきます。まず、追加の、リサイズされた画像のための追加のフィールドを追加するために必要とされる:

average = models.ImageField(
    blank=True, null=True, 
    verbose_name = _('Image'), 
    upload_to = upload_image, 
    editable  = False, 
) 

次に、これを(保存chngeするために必要とされる)、このようなものにする方法:

def save(self, *args, **kwargs): #force_insert=False, force_update=False, using=None): 
     source = self.original.image.path 
     target = self.upload_image(os.path.basename(source)) 

     Image.open(source).crop([ 
      self.x,    # Left 
      self.y,    # Top 
      self.x + self.w, # Right 
      self.y + self.h  # Bottom 
     ]).save(django_settings.MEDIA_ROOT + os.sep + target) 
     self.image = target 

     splited_target = target.split("/") 
     avepath = "/average-".join(splited_target) 
     self.average = avepath 

     Image.open(self.image).resize((104, 104), Image.ANTIALIAS).save(django_settings.MEDIA_ROOT + avepath, 'JPEG') 
     super(Cropped, self).save(*args, **kwargs) 

そして、それがすべてです。

関連する問題