116 lines
3.3 KiB
Python
Executable File
116 lines
3.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import os
|
|
import json
|
|
import argparse
|
|
import subprocess
|
|
import tempfile
|
|
import base64
|
|
from flask import Flask, request, Response
|
|
app = Flask(__name__)
|
|
|
|
@app.route('/', methods=['GET'])
|
|
@app.route('/alg', methods=['GET'])
|
|
def index():
|
|
return make_resp({})
|
|
|
|
def oss_save_image(data_url, file_prefix):
|
|
ak = 'LTAI5tC2qXGxwHZUZP7DoD1A'
|
|
sk = 'qPo9O6ZvEfqo4t8oflGEm0DoxLHJhm'
|
|
auth = oss2.Auth(ak, sk)
|
|
endpoint = 'oss-cn-guangzhou.aliyuncs.com'
|
|
bucket_name = 'emblem-roi-samples'
|
|
bucket = oss2.Bucket(auth, endpoint, bucket_name)
|
|
|
|
pref = 'data:image/png;base64,'
|
|
if data_url.startswith(pref):
|
|
decoded = base64.b64decode(data_url[len(pref):])
|
|
fname = file_prefix + str(time.time()) + ".png"
|
|
bucket.put_object(fname, decoded)
|
|
|
|
|
|
def make_resp(content):
|
|
resp = Response(json.dumps(content))
|
|
resp.headers['Access-Control-Allow-Origin'] = "*"
|
|
resp.headers['Access-Control-Allow-Methods'] = '*'
|
|
resp.headers['Access-Control-Allow-Headers'] = '*'
|
|
resp.headers['Content-Type'] = 'application/json'
|
|
return resp
|
|
|
|
@app.route('/alg/angle', methods=['POST', 'OPTIONS'])
|
|
def angle():
|
|
try:
|
|
return handle_angle_request()
|
|
except Exception as e:
|
|
return make_resp({
|
|
"ok": False,
|
|
"err": str(e),
|
|
})
|
|
|
|
def handle_angle_request():
|
|
if request.method == 'OPTIONS':
|
|
return make_resp({})
|
|
body = request.stream.read()
|
|
pref = 'data:image/jpeg;base64,'
|
|
err = "Cannot detect angle"
|
|
angle = -1
|
|
try:
|
|
encoded = body.decode()
|
|
if encoded.startswith(pref):
|
|
decoded = base64.b64decode(encoded[len(pref):])
|
|
else:
|
|
decoded = body
|
|
except:
|
|
decoded = body
|
|
with tempfile.NamedTemporaryFile(dir="uploads", suffix=".jpg", delete=False) as tf:
|
|
tf.write(decoded)
|
|
tf.flush()
|
|
cmd = ['./qrtool', 'angle', tf.name]
|
|
print(" ".join(cmd))
|
|
r = subprocess.run(cmd, capture_output=True)
|
|
if r.returncode == 0:
|
|
lines = r.stdout.decode().splitlines()
|
|
return make_resp({
|
|
"ok": True,
|
|
"qrcode": lines[0].split()[1],
|
|
"angle": int(lines[1].split()[1])
|
|
})
|
|
else:
|
|
err = r.stderr.decode()
|
|
return make_resp({
|
|
"ok": False,
|
|
"err": err,
|
|
})
|
|
|
|
def handle_rectify_request():
|
|
body = request.stream.read()
|
|
with tempfile.NamedTemporaryFile() as tf:
|
|
tf.write(body)
|
|
tf.flush()
|
|
outf = tf.name + ".qr.jpg"
|
|
cmd = ['./qrtool', 'rectify', tf.name]
|
|
subprocess.check_call(cmd)
|
|
with open(outf, 'rb') as of:
|
|
resp = Response(of.read(), status=200, mimetype='image/jpeg')
|
|
os.unlink(outf)
|
|
return resp
|
|
|
|
@app.route('/alg/rectify', methods=['POST', 'OPTIONS'])
|
|
def rectify():
|
|
try:
|
|
return handle_rectify_request()
|
|
except Exception as e:
|
|
return make_resp({
|
|
"ok": False,
|
|
"err": str(e),
|
|
})
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--host", "-l", default="0.0.0.0")
|
|
parser.add_argument("--port", "-p", type=int, default=3028)
|
|
return parser.parse_args()
|
|
|
|
if __name__ == '__main__':
|
|
args = parse_args()
|
|
app.run(host=args.host, port=args.port)
|