Django 第三方app 使用情景及方法–上传图片处理ImageKit

安装

        1、安装PIL 或者 Pillow,使用pip install PIL 或 pip install Pillow ;
        2、安装 django-imagekit,pip install django-imagekit;或者下载源码包放到 app 目录下
        3、在settings.py 里的 INSTALLED_APPS 里 增加 imagekit;
在Model 中使用
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
上边的 ImageSpecField 与 Django 的 ImageField 使用方法相似,只不过使用 processors 选项增加了 ResizeToFill 的处理,并且将 质量下降到 60% 并保存为 JPEG 图片。
值得说明的是,ImageSpecField 并不增加 Model 在数据库中的数据列,也不需要数据库,但是 ImageSpecField 基于 ImageField 使用(source)。
如果不想保存原图,可以使用  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
与 ImageSpecField 不同,ProcessedImageField 是需要数据库支持的,并且会产生新的列。
在 Form 中使用
from django import forms
from imagekit.forms import ProcessedImageField
from imagekit.processors import ResizeToFill

class ProfileForm(forms.Form):
    avatar_thumbnail = ProcessedImageField(spec_id='myapp:profile:avatar_thumbnail',
                                           processors=[ResizeToFill(100, 50)],
                                           format='JPEG',
                                           options={'quality': 60})
使用 form 版的 iamgekit 的好处是 可以在Model 中保持 纯净,即只使用 Django 的 ImageField,而把 图像处理的逻辑放在 form 中。
Processors 
上边我们只使用了 ResizeToFill 一个 processor 。Processor 处理的 一个PIL 的对象,然后返回一个新的对象。 
你可以把所有需要的 processor 放在 processors 列表里,imagekit 会按顺序执行。
from imagekit import ImageSpec
from imagekit.processors import TrimBorderColor, Adjust

class MySpec(ImageSpec):
    processors = [
        TrimBorderColor(),
        Adjust(contrast=1.2, sharpness=1.1),
    ]
    format = 'JPEG'
    options = {'quality': 60}
imagekit.processors 包含很多的 processor,比如 调整图片大小,旋转,调整颜色等等,也可以自己实现一些 processor 交付 imagekit 使用,通过实现一个 包含了 process() 方法类就可以了,例如:
class Watermark(object):
    def process(self, image):
        # Code for adding the watermark goes here.
        return image

下边是如何使用自定义的 processor:

from imagekit import ImageSpec
from imagekit.processors import TrimBorderColor, Adjust
from myapp.processors import Watermark

class MySpec(ImageSpec):
    processors = [
        TrimBorderColor(),
        Adjust(contrast=1.2, sharpness=1.1),
        Watermark(),
    ]
    format = 'JPEG'
    options = {'quality': 60}
如果你想找找都有哪些 processor 可以使用,你可以在 PILKit 中找找看,因为 import imagekit.processors 里的东西的时候,imagekit 也是重新引入 PILKit 里的东西。。。。(PILKit:https://github.com/matthewwithanm/pilkit )
 
在 Admin 中使用
from django.contrib import admin
from imagekit.admin import AdminThumbnail
from .models import Photo

class PhotoAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'admin_thumbnail')
    admin_thumbnail = AdminThumbnail(image_field='thumbnail')

admin.site.register(Photo, PhotoAdmin)
ImageKit 文档地址:http://django-imagekit.readthedocs.org/en/latest/
 
anyShare分享到: