📜  django 管理图像 - Python (1)

📅  最后修改于: 2023-12-03 15:14:44.485000             🧑  作者: Mango

Django管理图像

在Django中,管理图像是非常普遍的需求,无论是用户上传头像还是在网站上显示产品图片,都需要用到图像管理功能。本文将介绍如何使用Django来管理图像。

安装Django Image

在开始之前,需要安装一个名为Django Image的库,它能够帮助我们管理图片和其他媒体文件。可以通过以下命令来安装:

pip install django-image
图像上传
创建模型

首先需要创建一个模型来存储图像。在模型中,需要使用 ImageField 字段来表示图片的上传。

from django.db import models

class Photo(models.Model):
    title = models.CharField(max_length=255)
    image = models.ImageField(upload_to='photos/')

在这个例子中,我们创建了一个名为Photo的模型,包含了titleimage两个字段。其中image字段是 ImageField类型的,upload_to参数表示上传的图片存储在 MEDIA_ROOT/photos/ 文件夹下。

创建表单

接下来,需要为这个模型创建一个表单,允许用户上传图片。

from django import forms
from .models import Photo

class PhotoForm(forms.ModelForm):
    class Meta:
        model = Photo
        fields = ['title', 'image']

我们创建了一个名为 PhotoForm 的表单,它继承自 ModelForm,其中的 Meta 类指定了表单所对应的模型和该模型中需要显示的字段。

创建视图

接下来需要创建视图函数,它将处理上传图片的请求。

from django.shortcuts import render
from .forms import PhotoForm

def upload_photo(request):
    if request.method == 'POST':
        form = PhotoForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
    else:
        form = PhotoForm()
    return render(request, 'upload_photo.html', {'form': form})

这个 upload_photo 视图接收 POST 请求,如果 form 表单通过验证,就将图片保存在表单的 image 字段指定的位置。

创建模板

最后,需要创建模板 upload_photo.html ,用来展示表单和上传成功的消息。

{% extends 'base.html' %}

{% block content %}
    {% if message %}
        <p>{{ message }}</p>
    {% endif %}

    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Upload</button>
    </form>
{% endblock %}
图像处理
缩略图生成

Django Image 还提供了一个用来生成缩略图的方法,在settings.py中配置默认缩略图大小:

# settings.py

THUMBNAIL_SIZE = (256, 256)

然后在目标模板中增加以下代码,以生成缩略图:

<!-- photo.html -->
{% extends 'base.html' %}

{% block content %}
  <img src="{{ photo.image.url }}" alt="{{ photo.title }}">
  <!-- 缩略图生成保存于photots/下 -->
  <img src="{{ photo.image.thumbnail.url }}" alt="{{ photo.title }} Thumbnail">
{% endblock %}

指定缩略图大小:

<!-- photo.html -->
{% extends 'base.html' %}

{% block content %}
  <img src="{{ photo.image.url }}" alt="{{ photo.title }}">
  <!-- 用 width 和 height 指定除了默认缩略图之外的缩略图大小 -->
  <img src="{{ photo.image.thumbnail.256x256.url }}" alt="{{ photo.title }} Thumbnail" width="256" height="256">
{% endblock %}
图像信息展示

Django Image 还提供获取图像详细信息的方法:

from imagekit.models import ImageSpecField  # 用于生成该图像规格的实例字段
from imagekit.processors import ResizeToFill

class Thumbnail(models.Model):
    original = models.ImageField(
        upload_to='photos/', null=False, verbose_name=_('Original'))
    thumbnail = ImageSpecField(
        processors=[
            ResizeToFill(120, 100)  # 裁剪大小
        ],
        format='JPEG',  # 格式
        options={
            'quality': 60  # 品质,可选 0-100 的整数,默认为 100
        })

然后在模板中,可以使用以下代码获取该图像的长,宽,大小和创建日期:

<img src="{{ thumbnail.thumbnail.url }}" alt="thumbnail">
<p>Dimensions: {{ thumbnail.thumbnail.width }}x{{ thumbnail.thumbnail.height }}</p>
<p>File size: {{ thumbnail.thumbnail.size }}</p>
<p>Created: {{ thumbnail.thumbnail.created_at|date:"Y-m-d H:i:s" }}</p>
总结

在Django中管理图像需要掌握以下几个概念:模型、表单、视图和模板。通过上述步骤,你可以在Django中实现图像上传、缩略图生成和图像信息展示等功能。