网站开发中图像处理不可或缺,尤其涉及头像、用户上传的图片等。Django-ImageKit是一款强大的Django应用程序,能够与Django的model模块协同工作,自动完成图像裁剪、压缩、生成缩略图、加水印等一系列图片相关的操作,底层依赖于Pillow库。
一、安装配置django-imagekit
1.安装
<code>pip install pillow</code><code>pip install django-imagekit</code>
2.setting.py添加配置
<code>#settings.py</code><code> INSTALLED_APPS=[</code><code> ...</code><code> 'imagekit',</code><code> ...</code><code> ] </code>
完成上述步骤,即可在项目中使用 django-imagekit 来处理图片。
二、在模型中使用django-imagekit
1.models.py
上传图片并保存原图,ImageSpecField是虚拟的,不会在表中生成数据
。
<code>from django.db import models</code><code>from imagekit.models import ImageSpecField</code><code>from imagekit.processors import ResizeToFill</code><code><br></code><code>class Profile(models.Model):</code><code> <em>#原图</em></code><code> avatar = models.ImageField(upload_to='avatars')</code><code> <em>#处理后保存的图</em></code><code> avatar_thumbnail = ImageSpecField(source='avatar',</code><code> processors=[ResizeToFill(100, 50)],<em># 处理后的图像大小</em></code><code> format='JPEG',<em># 处理后的图片格式</em></code><code> options={'quality': 60})<em># 处理后的图片质量</em></code>
ImageSpecFields的工作方式与Django的ImageField
非常相似,不同之处在于它是基于 ImageKit。在上面的示例中,头像缩略图是头像图像的调整大小版本,保存为 JPEG 格式,带有 质量 60。
如果不保留原始图像,只想保存处理结果,可以使用ProcessedImageField
类。
<code>from django.db import models</code><code>from imagekit.models import ProcessedImageField</code><code>from imagekit.processors import ResizeToFill</code><code><br></code><code>class Profile(models.Model):</code><code> avatar_thumbnail = ProcessedImageField(upload_to='avatars',</code><code> processors=[ResizeToFill(100, 50)],</code><code> format='JPEG',</code><code> options={'quality': 60})</code>
在前端使用图片
src="{{ profile.avatar_thumbnail.url }}
三、在视图中使用imagekit
将imagekit定义为模型字段是处理图像的一种非常方便的方法, 但这不是唯一的方法,有时不能或不想将字段添加到models,可以使用自定义图像类在视图中直接使用。
<code>from imagekit import ImageSpec</code><code>from imagekit.processors import ResizeToFill</code><code><br></code><code>class Thumbnail(ImageSpec):</code><code> processors = [ResizeToFill(100, 50)]</code><code> format = 'JPEG'</code><code> options = {'quality': 60}</code>
这个类能够处理图像,与上面的 ImageSpecField 完全相同。
示例
<code>source_file = open('/path/to/myimage.jpg', 'rb')</code><code>image_generator = Thumbnail(source=source_file)</code><code>result = image_generator.generate()</code>
使用自定义图像生成类,需要进行注册才可以在前端使用。
<code>from imagekit import ImageSpec, register</code><code>from imagekit.processors import ResizeToFill</code><code><br></code><code>class Thumbnail(ImageSpec):</code><code> processors = [ResizeToFill(100, 50)]</code><code> format = 'JPEG'</code><code> options = {'quality': 60}</code><code><br></code><code>register.generator('myapp:thumbnail', Thumbnail)</code>
ImageKit 会自动尝试加载一个 每个已安装的应用程序中名为“imagegenerators”的模块。
四、生成图像
ImageKit提供通用的模板标签“generateimage”,它至少需要一个参数:已注册图像生成器的 ID。其他关键字样式的参数将传递给已注册的生成器类。参考如下:
<code>{% load imagekit %}</code><code>{% generateimage 'myapp:thumbnail' source=source_file %}</code>
输出以下 HTML:
<img src="/media/CACHE/images/982d5af84cddddfd0fbf70892b4431e4.jpg" width="100" height="50" />
还可以添加其他 HTML 属性,只需使用两个破折号的关键字参数,如下:
<code>{% load imagekit %}</code><code>{% generateimage 'myapp:thumbnail' source=source_file -- alt="A picture of Me" id="mypicture" %}</code>
未生成 HTML 图像标签,该标签还用作 assignment 标记,提供对基础文件对象的访问:
<code>{% load imagekit %}</code><code><br></code><code>{% generateimage 'myapp:thumbnail' source=source_file as th %}</code><code><a href="{{ th.url }}">Click to download a cool {{ th.width }} x {{ th.height }} image!</a></code>
五、缩略图
ImageKit 提供“缩略图” 模板标签:图片上传后会根据设定的参数生成处理后的图片,在前端使用调用如下代码:
<code>{% load imagekit %}</code><code><br></code><code>{% thumbnail '100x50' source_file %}</code>
与 generateimage 标签一样,thumbnail 标签输出一个 <img> 标签:
<img src="/media/CACHE/images/982d5af84cddddfd0fbf70892b4431e4.jpg" width="100" height="50" />
六、在forms中使用imagekit
除了上面的模型字段之外,还有一个forms表单字段版本的类,功能基本相同(它 处理图像一次并保存结果)。表单类:ProcessedImageField
forms.py
<code>from django import forms</code><code>from imagekit.forms import ProcessedImageField</code><code>from imagekit.processors import ResizeToFill</code><code><br></code><code>class ProfileForm(forms.Form):</code><code> avatar_thumbnail = ProcessedImageField(spec_id='myapp:profile:avatar_thumbnail',</code><code> processors=[ResizeToFill(100, 50)],</code><code> format='JPEG',</code><code> options={'quality': 60})</code>
使用和前边一样。
七、在admin中使用imagekit
<code>ImageKit 还包含一个类,用于在 Django admin中管理,AdminThumbnail 用作 Django 管理类:imagekit.admin.AdminThumbnail<br></code>
1.models方式管理
<code>from django.contrib import admin</code><code>from imagekit.admin import AdminThumbnail</code><code>from .models import Photo</code><code><br></code><code>class PhotoAdmin(admin.ModelAdmin):</code><code> list_display = ('__str__', 'admin_thumbnail')</code><code> admin_thumbnail = AdminThumbnail(image_field='thumbnail')</code><code><br></code><code>admin.site.register(Photo, PhotoAdmin)</code>
2.没有models方式管理
<code>from django.contrib import admin</code><code>from imagekit.admin import AdminThumbnail</code><code>from imagekit import ImageSpec</code><code>from imagekit.processors import ResizeToFill</code><code>from imagekit.cachefiles import ImageCacheFile</code><code><br></code><code>from .models import Photo</code><code><br></code><code>class AdminThumbnailSpec(ImageSpec):</code><code> processors = [ResizeToFill(100, 30)]</code><code> format = 'JPEG'</code><code> options = {'quality': 60 }</code><code><br></code><code>def cached_admin_thumb(instance):</code><code> <em># `image` is the name of the image field on the model</em></code><code> cached = ImageCacheFile(AdminThumbnailSpec(instance.image))</code><code> <em># only generates the first time, subsequent calls use cache</em></code><code> cached.generate()</code><code> return cached</code><code><br></code><code>class PhotoAdmin(admin.ModelAdmin):</code><code> list_display = ('__str__', 'admin_thumbnail')</code><code> admin_thumbnail = AdminThumbnail(image_field=cached_admin_thumb)</code><code><br></code><code>admin.site.register(Photo, PhotoAdmin)</code>
另外,AdminThumbnail 可以使用自定义模板。
八、图像处理器
ImageKit的功能远不止调整图像大小,而且这种功能来自其处理imagekit.processors.ResizeToFill,流程是处理器获取一个 PIL 图像对象,对其执行某些操作,然后返回一个新对象,一个规范可以使用任意数量的处理器。
该模块包含许多常见处理器 图像处理,如调整大小、旋转和颜色调整。然而 如果他们不能胜任任务,您可以创建自己的任务。
<code>from imagekit import ImageSpec</code><code>from imagekit.processors import TrimBorderColor, Adjust</code><code><br></code><code>class Watermark(object):</code><code> def process(self, image):</code><code> <em># Code for adding the watermark goes here.</em></code><code> return image</code><code><br></code><code>class MySpec(ImageSpec):</code><code> processors = [</code><code> TrimBorderColor(),</code><code> Adjust(contrast=1.2, sharpness=1.1),</code><code> Watermark(),</code><code> ]</code><code> format = 'JPEG'</code><code> options = {'quality': 60}</code>
以上为Django-ImageKit的综合使用指南,希望对您的网站图像处理需求提供全面而有效的解决方案
暂无评论内容