[Django] OpenCV(numpy)/PIL画像データをmodels.ImageFieldに保存する

 numpy/PILのデータはそのままだとdjangoのmodels.ImageFieldとして保存できません。

 以下のようにInMemoryUploadedFileに変換してあげる必要があります。

 image_fileをmodels.createなどで指定すればファイル保存できます。

from PIL import Image
import io
from django.core.files.uploadedfile import InMemoryUploadedFile

filename = ファイル名
image = Numpy配列
image = Image.fromarray(image)
image_io = io.ByteIO()
image.save(image_io, format="JPEG")
image_file = InMemoryUploadedFile(image_io, field_name=None, name=filename,
                                  content_type="image/jpeg", size=image_io.getbuffer().nbytes,
                                  charset=None)

 djangoはmodels内でファイル操作する場合はUploadedFileを継承したクラスを使用する必要があります。

 TemporaryUploadedFile, InMemoryUploadedFileあたりが該当します。

コメントを残す

メールアドレスが公開されることはありません。