图片处理神器Django-imagekit,简单实用

Django-imagekit是一个强大的Django应用,用于处理图像,包括生成缩略图、黑白版等。它提供了图像处理器,可以自定义规格,适用于处理用户上传的图片。在模型中定义ImageSpecField或ProcessedImageField,结合模板标签使用,实现灵活的图像处理功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
觉得好的点个赞 :)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值