admin管理员组

文章数量:1609936

触动精灵使用lua实现对手机的自动化操作, 比按键精灵好用, 现在有个小需求就是对手机截屏后将图片通过post方式提交到服务器端.

lua代码

python用习惯了, 再写lua的代码总感觉有点别扭, 有些语法还得再翻翻文档,这里再复习一下常用的操作:

  • 字符串拼接使用.., 例如"hello".." world"
  • 调用对象对应的方法需要用冒号,比如var_a:func()
  • 表(字典)定义语法和python唯一的区别是key不用加引号,后面=值, 例如table={id=1, value="wtf"}
  • 代码注释开头用--
local ts = require("ts")	-- base64转换相关函数需要先引入ts库

-- 截屏
w, h = getScreenSize();	-- 获取屏幕尺寸
snapshot("screen.png", 0, 0, w-1, h-1)	-- 截图文件完整路径/sdcard/TouchSprite/res/screen.png

root_path = userPath()	-- 获取当前的用户路径,即上面截图完整路径的/sdcard/TouchSprite/res部分
f = io.open(root_path.."/res/screen.png", "rb")	-- 拼接成完整路径后打开截屏的文件
data = f:read("*a");	-- 将图片文件读入到内存变量data中
f:close();	-- 关闭文件
base_data = data:base64_encode()	-- 进行base64转换

-- 定义要进行post发送的数据结构, 主要是对body_send进行定义, 其他参数是固定写法, 官方文档中有详细说明
table = {
	tstab="tstab",
	body_send={img=base_data},
	format="utf8"
	}

url = "http://127.0.0.1:5000"	-- 要接收post请求的地址
code, header, body = ts.httpPost(url, table)	-- 发送post请求并接收响应代码,头信息,主信息
dialog(body)	-- 对话框显示一下返回内容

服务器Python代码

服务器端用flask随便撸一个处理post请求的api, 这里需要注意的是, 触动精灵在发送post数据的时候,会将base64编码里面的+加号替换成空格,所以如果直接用post过来的数据扔给<img>标签进行解析的话会显示不出来的, 因此必须在服务器端再将接受到的base64字符串里面的空格替换回+

from flask import Flask, jsonify, request, render_template

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
	    # 触动精灵发送post请求时会将+加号替换成空格,这里需要回转一下
        img_data = request.form.get('img').replace(' ', '+')	
        # 接收到的base64数据存到文件里
        with open('img.base', 'w') as f:
            f.write(img_data)

        return jsonify({
            'code': 0,
            'msg': 'OJBK成功'
        })
    else:
    	# 从文件里面读出来base64数据, 扔给前端模板渲染成<img>
        with open('img.base', 'r') as f:
            img_data = f.read()
            return render_template('index.html', img=img_data)


if __name__ == '__main__':
    app.run()

模板里面注意使用<img>标签渲染base64格式数据的时候,要在前面加上data:image/png;base64,

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<body>
<img src="https://img-blog.csdnimg/2022010703251530080.png">
</body>
</html>

优化服务器端, png转成webp格式

由于触动精灵上传过来的png格式图片比较大, 下面用python把png转成webp格式的base64编码进行存储和前端渲染

def png2webp(base_data):
    """
    png转webp, 需要用到Pillow包, `pip install Pillow`
    :param base_data: png格式的base64字符串
    :return: webp格式的base64字符串
    """
    # 先将base64字符串解码成BytesIO对象
    bytes_io = io.BytesIO(base64.b64decode(base_data))
    # 转换成Image类型对象
    im = Image.open(bytes_io)
    # 定义内存中使用的字节类型对象用来存放转码后的图片数据
    output = io.BytesIO()
    # 转换成webp格式后存入二进制对象
    im.save(output, format='webp')
    # 二进制对象再转成base64字符串返回
    return base64.b64encode(output.getvalue()).decode('utf8')

对比一下转换前后的大小:

  • 原始PNG格式: 101,064 字节
  • WebP格式: 43,928 字节

转换后的大小只有原来的43%, 可以说疗效是相当显著的了! 注意模板渲染的时候需要将<img src="https://img-blog.csdnimg/2022010703251530080.png">改成<img src="https://img-blog.csdnimg/2022010703251519722.webp">

本文标签: 字符串转成精灵方式服务器