画像処理の神器Django-imagekit、簡単で実用的です

12291 ワード

ImageKitは、画像を処理するためのDjangoアプリケーションです.サムネイルは必要ですか?ユーザーは画像の白黒バージョンをアップロードしますか?ImageKitが作ってくれます.プログラムで別の画像から画像を生成する必要がある場合は、ImageKitが必要です.ImageKitでは、サイズの調整やトリミングなどの一般的なタスクのセットを提供していますが、独自の画像プロセッサを作成することもできます.
PILまたはPillowをインストールします.(DjangoでImageFieldを使用する場合は、すでにそうしているはずです)pipインストールDjango-imagekitプロジェクトのsettingsに「imagekit」を追加します.pyのINSTALLED_APPSリスト
モデルで仕様を定義するには、画像仕様を定義する最も簡単な方法は、モデルクラスでimagespefieldを使用することです.
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})

profile = Profile.objects.all()[0]
print profile.avatar_thumbnail.url    # > /media/CACHE/images/982d5af84cddddfd0fbf70892b4431e4.jpg
print profile.avatar_thumbnail.width  # > 100

ご存知のように、imagespefieldsの動作原理はDjangoのImageFieldsとよく似ています.違いは、ImageKitが与えた命令に従って自動的に生成することです.上記の例では、avatarサムネイルはavatar画像のサイズを調整したバージョンであり、JPEG形式で保存され、品質は60である.しかし、元の画像(上記の例のアバタ)を保持する必要がない場合があります.ユーザーが画像をアップロードすると、処理して結果を保存するだけです.これらの場合、ProcessedImageFieldクラスを使用できます.
from django.db import models
from imagekit.models import ProcessedImageField

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

profile = Profile.objects.all()[0]
print profile.avatar_thumbnail.url    # > /media/avatars/MY-avatar.jpg
print profile.avatar_thumbnail.width  # > 100

これは前の例とよく似ています.別の画像フィールドを処理しないため、「source」を指定する必要はありませんが、「upload_to」パラメータを渡す必要があります.これはDjango ImageFieldsの動作と全く同じです.
私たちのImageSpecFieldに「upload_to」パラメータが必要ない理由を知りたいかもしれません.なぜなら、ProcessedImageFieldsは実際にはimagefieldsのようにファイルパスをデータベースに保存し、モデルにファイルを追加する場合はsyncdbを実行する必要があります(または移行を作成する必要があります).一方、imagespefieldsは仮想的です.データベースにフィールドを追加したり、データベースを必要としたりしません.多くの理由から便利ですが、これは、ソースイメージと仕様に基づいてイメージファイルへのパスをプログラミングする必要があることを意味します.
モデル以外の仕様を定義してspecsをmodelフィールドとして定義することは、画像を処理するのに非常に便利な方法ですが、唯一の方法ではありません.モデルにフィールドを追加できない(または追加したくない)場合がありますが、これは関係ありません.画像仕様クラスを定義し、直接使用できます.これは、特にユーザ入力に依存する場合に、ビューにおける画像処理に特に有用である.
from imagekit import ImageSpec
from imagekit.processors import ResizeToFill

class Thumbnail(ImageSpec):
    processors = [ResizeToFill(100, 50)]
    format = 'JPEG'
    options = {'quality': 60}


source_file = open('/path/to/myimage.jpg')
image_generator = Thumbnail(source=source_file)
result = image_generator.generate()

imagesesesspecfieldまたはProcessedImageFieldを持つモデルがあれば、通常の画像フィールドを使用するように、これらの処理された画像を簡単に使用できます.
<img src="{{ profile.avatar_thumbnail.url }}" />

(これは、「profile」というコンテキスト変数をprofileモデルインスタンスに設定するビューがあるとします.)ただし、テンプレートに処理された画像ファイルを直接生成することもできます.モデルにコンテンツを追加する必要はありません.これを行うには、前のセクションで行ったように、まずアプリケーションで画像ジェネレータクラスを定義する必要があります(specsはジェネレータのタイプであることを覚えておいてください).テンプレートでジェネレータを参照する方法も必要なので、登録する必要があります.
from imagekit import ImageSpec, register
from imagekit.processors import ResizeToFill

class Thumbnail(ImageSpec):
    processors = [ResizeToFill(100, 50)]
    format = 'JPEG'
    options = {'quality': 60}

register.generator('myapp:thumbnail', Thumbnail)

一般的な例では、ImageKitには「サムネイル」テンプレートラベルも用意されています.
{% load imagekit %}

{% thumbnail '100x50' source_file %}

{% thumbnail '100x50' source_file -- alt="A picture of Me" id="mypicture" %}
{% thumbnail '100x50' source_file as th %}

マルチプレイの参考:https://django-imagekit.readthedocs.io/en/latest/index.html良い点はいいと思います:)