日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

触动精灵将图片转成base64字符串后通过post方式上传给服务器

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 触动精灵将图片转成base64字符串后通过post方式上传给服务器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

觸動精靈使用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.pngroot_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_templateapp = 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.cn/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.cn/2022010703251530080.png">改成<img src="https://img-blog.csdnimg.cn/2022010703251519722.webp">

總結

以上是生活随笔為你收集整理的触动精灵将图片转成base64字符串后通过post方式上传给服务器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。