ImageKit是一个用于处理图像的Django应用程序。需要一个缩略图吗?用户上传图片的黑白版本?ImageKit会为你制作。如果需要通过编程从另一个图像生成一个图像,则需要ImageKit。
ImageKit提供了一组图像处理器,用于调整大小和裁剪等常见任务,但您也可以创建自己的图像处理器。
安装PIL或Pillow。(如果您在Django中使用ImageField,那么您应该已经这样做了)
pip安装Django -imagekit
将“imagekit”添加到项目的settings.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()
如果你有一个带有imagesespecfield或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
觉得好的点个赞 :)