1

Django初心者:)

パッケージdjango-storagesを介してS3ストレージを使用しています。管理者を介して新しい画像をアップロード/更新すると、これは完璧に機能するようです。

models.py(画像フィールド)

 image = models.ImageField(
        upload_to=path_and_rename("profiles"),
        height_field="image_height",
        width_field="image_width",
        null=True,
        blank=True,
        editable=True,
        help_text="Profile Picture",
        verbose_name="Profile Picture"
    )
    image_height = models.PositiveIntegerField(null=True, blank=True, editable=False, default="100")
    image_width = models.PositiveIntegerField(null=True, blank=True, editable=False, default="100")

次に、アップロード時に画像のサイズを変更することにしたので、saveoverrideメソッドに次のコードを追加してみてください...

def save(self, *args, **kwargs):


        if not self.id and not self.image:
            return

        super(Profile, self).save(*args, **kwargs)


        image = Image.open(self.image).seek(0)
        (width, height) = image.size
        size = ( 100, 100)
        image = image.resize(size, Image.ANTIALIAS)
        image.save(self.image.path)

これが問題です、これは次のエラーを引き起こしました...。

画像ファイルを識別できません

次に、昨日スタックに質問を投稿し(削除しました)、この回答にリンクしているユーザーDjango PIL:IOError私が理解している画像ファイルを識別できません(画像がアップロードされていないため、まだ読み取ることができません)。しかし、それが私の問題かどうかはわかりません。エラーが発生した場合、画像ファイルを識別できません。元のファイルが実際にS3にアップロードされていることがわかります(もちろんサイズ変更はありません)

私が初心者であることを思い出して、この問題を解決する方法で誰かが私の例の保存方法を変更(および説明)できますか?つまり、アップロード時に新しい画像を100x100にサイズ変更する方法はありますか?

どうもありがとう

4

2 に答える 2

6

すでに書き込まれている場合は、ストレージを使用してファイルを読み取り、サイズを変更します。

def save(self, *args, **kwargs):
        if not self.id and not self.image:
            return

        super(Profile, self).save(*args, **kwargs)


        import urllib2 as urllib
        from cStringIO import StringIO
        from django.core.files.uploadedfile import SimpleUploadedFile

        '''Open original photo which we want to resize using PIL's Image object'''
        img_file = urllib.urlopen(self.image.url)
        im = StringIO(img_file.read())
        resized_image = Image.open(im)




        '''Convert to RGB if necessary'''
        if resized_image.mode not in ('L', 'RGB'):
            resized_image = resized_image.convert('RGB')

        '''We use our PIL Image object to create the resized image, which already
        has a thumbnail() convenicne method that constrains proportions.
        Additionally, we use Image.ANTIALIAS to make the image look better.
        Without antialiasing the image pattern artificats may reulst.'''
        resized_image.thumbnail((100,100), Image.ANTIALIAS)

        '''Save the resized image'''
        temp_handle = StringIO()
        resized_image.save(temp_handle, 'jpeg')
        temp_handle.seek(0)

        ''' Save to the image field'''
        suf = SimpleUploadedFile(os.path.split(self.image.name)[-1].split('.')[0],
                                 temp_handle.read(), content_type='image/jpeg')
        self.image.save('%s.jpg' % suf.name, suf, save=True)
于 2013-03-01T11:06:26.990 に答える
0

あなたが期待するなら

image.save(self.image.path)

働くために。で開けてはいけません

image = Image.open(self.image.path).seek(0)

于 2013-03-01T10:16:00.737 に答える