Как получить ответ изображения в django api, после того, как закодировал его в base64? - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь создать API-интерфейс django, который принимает изображение из метода post. После этого я изменил его на оттенки серого, а затем попытался отправить это изображение в виде HttprResponse после того, как закодировал его в base64. (На самом деле, я не знаю, как отправить строку в кодировке base64 в качестве ответа. Я новичок в python). Вот мой код:

# import the necessary packages
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse, HttpResponse
import numpy as np
import urllib.request
import json
import cv2
import os
import base64

@csrf_exempt
def combine(request):

    # check to see if this is a post request
    if request.method == "POST":
        # check to see if an image was uploaded
        if request.FILES.get("image1", None) is not None:
            # grab the uploaded image
            image1 = _grab_image1(stream=request.FILES["image1"])
            # image2 = _grab_image2(stream=request.FILES["image2"])

            gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)

            final = base64.b64encode(gray)

    # return a response
    return HttpResponse(final)


def _grab_image1(stream=None):
        if stream is not None:
            data = stream.read()

            image1 = np.asarray(bytearray(data), dtype="uint8")
            image1 = cv2.imdecode(image1, cv2.IMREAD_COLOR)

        # return the image1
            return image1

Я использую почтальон для проверки.

Postman preview

И от HttpResponse я получаю много строк, как вы можете видеть на изображении выше. Я скопировал эти строки и попытался декодировать их онлайн, чтобы получить окончательное изображение. На что я не получаю изображения:

Online base64 to image conversioin

Итак, как получить изображение (закодированное в base64) в ответ django api.

1 Ответ

0 голосов
/ 03 января 2019

Сначала вы должны закодировать его в формате jpg (при условии, что ваше изображение в формате JPG), а затем вы можете вызвать final = base64.b64encode(gray) на него!Это потому, что cv2.cvtColor() вернет <class 'numpy.ndarray'> массив numpy, который не может быть закодирован как base64 напрямую!

retval, buffer_img= cv2.imencode('.jpg', gray)
final = base64.b64encode(buffer_img)

final содержит правильную строку base64 для вашего изображения, которую можно легко вернуть обратно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...