首页 > 解决方案 > 使用 django 捕获图像并将其保存到数据库

问题描述

我正在尝试使用 django 制作一个 Web 应用程序,它在其中单击相机中的图像并将图像保存到数据库中。那如何实施?如果有可用的源代码,请分享它的链接。谢谢你

标签: pythondjangodatabaseweb-applicationswebcam

解决方案


我来到这里希望找到答案;没有一个,我特此提供我的...

诀窍是对图像进行编码并将其保存为TextField

我提供的解决方案在每次加载select_image.html时读取图像的方式有点笨拙,但我这样做是因为我的要求有点复杂,这可以完成工作。我假设您知道如何从相机中获取图像(这相当于我从文件中读取图像)。

有两个模板,select_image.htmldisplay_image.html。当第一次调用select_image.html时,它会从文件中读取.png图像并将图像保存到数据库中。选择图像时,将从数据库中检索并显示在display_image.html中。

select_image.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Select Image</title>
</head>
<body>
    <h1>Select Image</h1>

    {% block content %}
        <ul>
            {% for image in images %}
                <li><a href="display-image/{{ image }}">{{ image }}</a></li>
            {% endfor %}
        </ul>
    {% endblock %}
</body>
</html>

display_image.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Display Image</title>
</head>
<body>
    <h1>Display Image</h1>

    {% block content %}
        <img id="image" src="{{ image }}" alt="image">
    {% endblock %}
    <p></p>
    <a href="/users/images">Images</a>
</body>
</html>

模型.py

class Image(models.Model):
    name = models.CharField(max_length=25, null= False, blank=False, default='image_name', unique=True)
    image = models.TextField()

网址.py

urlpatterns = [
    path('images', views.Images.as_view(), name='images'),
    path('display-image/<str:image_name>/', views.DisplayImage.as_view(), name='display-image'),
]

视图.py

from PIL import Image as PilImage
import io
import base64
import os
from .models import Image

class Images(View):
    url = "images/select_image.html"

    def get(self, request):
        dir = <image file directory>
        image_names = ['red', 'green', 'blue']
        for image_name in image_names:
            base_path = os.sep.join([dir, image_name])
            path = '.'.join([base_path, 'png'])
            pil_image = PilImage.open(path)
            encoded_image = self._encode_image(pil_image)
            Image.objects.get_or_create(name=image_name, image=encoded_image)
        context = {'images': image_names}
        return render(request, self.url, context)

    @staticmethod
    def _encode_image(image):
        """Return image encoded to base64 from a PIL.Image.Image."""
        io_buffer = io.BytesIO()
        image.save(io_buffer, format='PNG')
        saved_image = io_buffer.getvalue()
        encoded_image = ''.join(['data:image/jpg;base64,', base64.b64encode(saved_image).decode()])
        return encoded_image

class DisplayImage(View):
    url = "images/display_image.html"

    def get(self, request, image_name):
        image = get_object_or_404(Image, name=image_name)
        context = {'image': image.image}
        return render(request, self.url, context)

推荐阅读