小神獸們終于要開學了隔缀,但家長們的煩心事一點也沒少:學校通知丢习,每天統(tǒng)計每個學生和同住人員的健康碼、行程碼钉汗,并且要合并到一張圖上酒来。
起初我覺得這用電腦自帶的圖片編輯器伟墙,不過是ctrl-c + ctrl-v的事嘛失息,對程序員來說守伸,輕車熟路啊。然而打開我的macbook才發(fā)現(xiàn)玄呛,這圖片編輯器也太難用了吧徘铝,根本找不到圖片畫布大小功能废登,翻箱倒柜找到我的老Windows,傳圖》保存到本地〉挨個編輯》加名字文本〉合并,忙活了10分鐘疚俱,再說每次都要到電腦跟前也費事了养晋。
作為一個有潔癖的碼農(nóng),決不允許同樣的流程化、重復的事件,在我的生活中冗余出現(xiàn)。
于是便有了下面的一鍵自動合成小程序榆骚。
實現(xiàn)效果如下:
WechatIMG33.jpeg
技術棧使用
采用了前后端分離的架構,別問我為啥不直接用js腳本處理圖片。
前端
- Trao、Taro UI(功能比較簡單,復雜的邏輯)
- Dva
- React
服務端
- Python
- flask
- docker (容器化部署揪惦,穩(wěn)定省心)
- minio
- opencv
核心圖片處理腳本
# 處理多個圖片的拼接
def join_images(self, work_dir, image_list=[], flag='horizontal', max_height=1280): # 默認是水平參數(shù)
mark_output_dir = f"{work_dir}/output"
output_image = f"{work_dir}/joint.png"
if flag == 'horizontal':
max_width = 0
img_list = []
for image in image_list:
img_path = f"{work_dir}/{image['file_name']}"
r_img_path = f"{work_dir}/r_{image['file_name']}"
mark_img_path = f"{work_dir}/output/r_{image['file_name']}"
img_byte = Image.open(img_path)
img, width = self.resize_image(img_byte, max_height)
img.save(r_img_path)
add_text = image['add_text'] if image['add_text'] else ''
self.mark_text(r_img_path, add_text, mark_output_dir) # 圖片添加水印
max_width += width + 5
img_new_byte = Image.open(mark_img_path)
img_list.append(img_new_byte)
joint = Image.new("RGB", (max_width - 5, max_height))
pre_img = None
start = 0
for index, img in enumerate(img_list):
if index == 0:
joint.paste(img, (0, 0))
else:
start += pre_img.size[0] + 5
joint.paste(img, (start, 0))
pre_img = img
joint.save(output_image)
compress_image(output_image, mb=1)
if os.path.isfile(output_image):
self.output_image = output_image
結語
功能還在不斷完善中,主要先解決自身的使用問題胸嘁,如果有什么建議歡迎留言反饋。