无论是做哪种业务,但凡是涉及到图片的,一定会有裁图的需求。但是裁图的需求又分好几种,主要的两种是:一种是被动裁图,可以裁出各种尺寸或限定的几种尺寸;另外一种是主动裁图,裁出固定的几种尺寸。
以前是用nignx的一个裁图模块image_filter根据URL的参数来裁图,比方说,有原图:/images/fire.png, 通过请求 /images/fire.png/30x30 就可以得到一个90x90的方图,这是被动裁图只有接收到用户请求之后才处理图片。再就是程序先自动去请求一遍。这种方式的另外一种做法就是自己在程序中裁图,对于读多写少的应用来说还挺合适。
python中怎么搞呢?Pillow当然可以,它很强大我做图像处理也经常用到Pillow。如果在Django中处理,那就要考虑是不是有人已经在Pillow上做好了更符合Django流程的封装了,Django-imagekit就是这么个东西!真的是裁图神器!!!!!
1. 安装
要在 Django 使用 ImageField 模块,必须先安装第三方库 Pillow然后才能安装django-imagekit:
pip install pillow
pip install django-imagekit
完成上述步骤后,在 Django 项目的 settings.py
文件中的 INSTALLED_APPS
添加上: 'imagekit'
。
现在准备工作全部完成,可以在项目中使用 django-imagekit 来处理图片了。
然后你要更改你的models.py
from django.db import models
from imagekit.models import ImageSpecField,ProcessedImageField
from imagekit.processors import ResizeToFill
class ImInfo(models.Model):
# 原图片在项目中存储的相对路径
imgpic = models.ImageField(verbose_name="图片路径", default="image/default.png", upload_to='DF_goods/Image/%Y/%m', null=True, blank=True) # 商品图片
# 方式一:
imgpic_30x30 =ImageSpecField(
# 原图
source='imgpic',
# 处理后的图像大小
processors=[ResizeToFill(30, 30)],
# 处理后的图片格式
format='JPEG',
# 处理后的图片质量
options={'quality': 90}
)
# 方式二:
imgpic_90x90 =ProcessedImageField(
upload_to='DF_goods/Image/%Y/%m',
processors=[ResizeToFill(90, 90)],
format='JPEG',
options={'quality': 90}
)
class Meta:
db_table = 'img' # 指明数据库表名
verbose_name = '图片' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
可以看到我写了两种方式 ImageSpecField,ProcessedImageField。这两个有何区别呢?
方式二与我们之前的方式一非常相似。由于我们不处理另一个图像字段,因此不再需要指定“源”,但是我们确实需要传递“ upload_to”参数。这与Django ImageFields的行为完全相同。
ImageSpecFields是虚拟的,它们不向您的数据库添加任何字段,也不需要数据库。由于很多原因,这很方便,但这意味着需要基于源图像和规范以编程方式构造图像文件的路径。
ProcessedImageFields确实与ImageFields一样,它们将文件路径保存在数据库中,并且在向模型中添加一个时需要运行syncdb(或创建迁移)。