관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[Flask] 플라스크 서버 -> 안드로이드 클라이언트 이미지 응답받기 본문

웹/Flask

[Flask] 플라스크 서버 -> 안드로이드 클라이언트 이미지 응답받기

막무가내막내 2020. 10. 29. 23:24
728x90

 

 

안드로이드 클라이언트 -> 플라스크 서버로   이미지 전송한 후 

이미지에 아웃포커싱 시스템을 적용한 후 해당 사진을

플라스크 서버 -> 안드로이드 클라이언트로 이미지 응답하는 것이 필요했습니다.

 

추후 삽질을 덜기 위해 구현 방법을 기록합니다.

 

[Flask Server]

send_file(file_dir, mimetype='image/jpg') 을 이용하여 이미지가 있는 경로를 매개변수로 넣어 리턴해줍니다.

# -*- coding: utf-8 -*-

# from google.cloud import storage
import os
# import cv2
from flask import jsonify

import numpy as np
import flask
from flask import request, render_template
from flask import send_file
import io
# import redis
# import tensorflow as tf
# import matplotlib.pyplot as plt
# import cv2

# from flask_cors import CORS, cross_origin
from werkzeug.utils import secure_filename
from werkzeug.datastructures import ImmutableMultiDict
from werkzeug.datastructures import FileStorage

# from blur_process_funcs import *
#from utils import *

# model_path = './model/unet_nomal_ver4.h5'
# Flask 애플리케이션과 Keras 모델을 초기화합니다.
# import redis
# redis_conn =  redis.StrictRedis(host='localhost',port=6379,db=0)
# 구현한 유틸리티 import
app = flask.Flask(__name__)


# CORS(app)


# model = load_Model(model_path);

# 파일 업로드
@app.route('/predict', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        print(flask.request.files)
        print(flask.request.files.get('image'))
        # print(flask.request.files['20200912_174631.jpg'])
        print(flask.request.form)
        file_dir = "D:\Git\VisionApp\ex1234.jpg"

        f2 = flask.request.files.get('image')
        f2.save(file_dir)
        # img = cv2.imread('D:\Git\VisionApp\ex1234.jpg')
        # 내가 찍은 X, Y 좌표 리스트 (Float 형)
        #x_list = np.uint(request.form.getlist('x'))
        #y_list = np.uint(request.form.getlist('y'))
        # 유저 백그라운드 포인트

        """서버에서 positive_anno_mask을 upload_file에 대한 리스폰스값으로 보내야댐"""
        # positive_anno_mask = get_User_Annotation_point_Mask(x_list, y_list, img)

        # nx_list = np.uint(request.form.getlist('nx'))
        # ny_list = np.uint(request.form.getlist('ny'))
        # negative_anno_mask = get_User_Annotation_point_Mask(x_list,y_list,img)

        # 파일 받기
        f = request.files['image']

        filename = secure_filename(f.filename)
        f.save(os.path.join('./' + filename))
        print(f.filename)
        sfname = str(secure_filename(f.filename))
        f.save(sfname)
    return send_file(file_dir, mimetype='image/jpg')
    #return "성공"


# 실행에서 메인 쓰레드인 경우, 먼저 모델을 불러온 뒤 서버를 시작합니다.
if __name__ == "__main__":
    print(("* Loading Keras model and Flask starting server..."
           "please wait until server has fully started"))
    # load_model()
    # 0.0.0.0 으로 해야 같은 와이파에 폰에서 접속 가능함
    app.run(host='0.0.0.0')


# def upload_blob(bucket_name, source_file_name, destination_blob_name):
#     """Uploads a file to the bucket."""
#     # bucket_name = "your-bucket-name"
#     # source_file_name = "local/path/to/file"
#     # destination_blob_name = "storage-object-name"
#
#     storage_client = storage.Client()
#     bucket = storage_client.bucket(bucket_name)
#     blob = bucket.blob(destination_blob_name)
#
#     blob.upload_from_filename(source_file_name)
#
#     print(
#         "File {} uploaded to {}.".format(
#             source_file_name, destination_blob_name
#         )
#     )

 

 

[Android Client]

ResponseBody 에서 이미지 바이트를 추출하여 비트맵을 만들어 사용합니다.

일반적인 Retorifit2 를 사용했습니다.

apiInteface.getTest(body, xList, yList).enqueue(object : Callback<ResponseBody> {
            override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                Log.d("AAA", "FAIL REQUEST ==> " + t.localizedMessage)
                drawImageView.clear()
            }

            override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
                Log.d("AAA", "REQUEST SUCCESS ==> ")
                val file = response.body()?.byteStream()
                val bitmap = BitmapFactory.decodeStream(file)
                drawImageView.clear()
            }
        })

 

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다. !

 

728x90
Comments