はじめに
メモ程度なので、Djangoの細かい設定は省きます。
プロジェクトはimage_pred, アプリ名はmyappとしています。
設定は公式ページの最初の部分にあるような基本的なところしかやっておりません。
#プログラム
index.htmlから、フォームを使って画像を送ります。
index.html
{% load static %}
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>title</title>
</head>
<body>
<div id = "input_form">
<form action="{% url 'index' %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form }}
<input type="submit" value="送信" />
</form>
</div>
<!--<div id = "prevent"><img src="{{question_id}}"></div>-->
<div id = "predict">{{urls}}</div>
</body>
</html>
forms.py
from django import forms
class PhotoForm(forms.Form):
image = forms.ImageField(label='画像を選択してください')
views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.views.generic import TemplateView
from .forms import PhotoForm
class MyappView(TemplateView):
def __init__(self):
self.params={'form': PhotoForm()}
def get(self, req):
return render(req, 'index.html', self.params)
def post(self, req):
form = PhotoForm(req.POST, req.FILES)
if not form.is_valid():
raise ValueError('invalid form')
image = form.cleaned_data['image']
self.url_get(req, image)
return render(req, 'index.html', self.params)
def url_get(self, req, url):
from PIL import Image
import base64
import io
from io import BytesIO
img = Image.open(url)
with io.BytesIO() as output:
img.save(output,format="JPEG")
contents = output.getvalue()
data = base64.b64encode(contents)
#print('data:image/jpeg;base64,' + str(data)[2:-1])
self.params['urls'] = 'data:image/jpeg;base64,' + str(data)[2:-1]
結果
このような結果が表示されると思うので、これを元に画像を表示することができます。
参考文献
プロジェクトの作成などは、この資料に基づいているので、プログラムも同一の部分は多くあります。
https://trafalbad.hatenadiary.jp/entry/2018/09/11/105500