読者です 読者をやめる 読者になる 読者になる

たにしきんぐダム

プログラミングやったりアニメやゲーム見たり京都に住んだりしてます

django-imagekit使ってみた

djangoに画像をアップロードする際、自動でリサイズとかしたいときにdjango-imagekitを使うと便利らしい。

django-imagekit

github.com

インストール

githubのリンクに書いてある通り。

pip install pillow
pip install django-imagekit

settings.pyのINSTALLED_APPSに'imagekit'を追加

ImageSpecField

ImageFieldにアップロードした画像のサムネを作りたいときなんかはImageSpecFieldを使う。
githubのreadmeのままだけど…

from django.db import models
from imagekit.models import ImageSpecField
from imagekit.processors import ResizeToFill

class Profile(models.Model):
    avatar = models.ImageField(upload_to='avatars')
    avatar_thumbnail = ImageSpecField(source='avatar',
                                      processors=[ResizeToFill(100, 50)],
                                      format='JPEG',
                                      options={'quality': 60})

avatarは普通にImageFieldを使って定義したもの。ImageSpecFieldの引数の意味はなんとなく分かると思う。sourceは元になるImageField、アップロード先は指定する必要ないです。
ImageSpecFieldは仮想的な(?)もので実際にデータベースに'avatar_thumnail'という列は作らない。
これでProfile.avatarに画像をアップロードした際に自動的にリサイズされjpg変換されたサムネ画像が生成される。

サムネ画像の保存先

そのサムネ画像が生成される場所はデフォルトだと,settings.pyで設定したMEDIA_ROOTの相対パスi'CACHE/images/upload_to'になるっぽい。

例えばsettings.pyにおいて

MEDIA_ROOT = 'home/tanishiking/django_project/cms/media/'

の場合、保存先は

home/tanishiking/django_project/cms/media/CACHE/images/avatar/filename.jpg

これはsettings.pyでIMAGEKIT_CACHEFILE_DIRをいじくることで変えられる。

テンプレート側でサムネ画像を呼び出すときは

<img src="{{ profile.avatar_thumbnail.url }}" />

で呼び出せる。

トラブルシューティング

サムネ画像が生成されない

サムネ画像の保存先のディレクトリが無くて作られなかった?

python manage.py generateimages

でディレクトリ、画像が作られて、その後は普通にサムネ画像が作られるようになった。

error decoder jpeg not available

python manage.py generateimages

しようとするとこんなエラーが出る。

jpegをpillowで扱うときはpillowのコンパイル時にlibjpeg-devが必要っぽい。
libjpeg-devをインストールしてからpillowを再インストールしたら治った

sudo apt-get install libjpeg-dev
pip install -I pillow

(ubuntu-14.04)