小神兽们终于要开学了,但家长们的烦心事一点也没少:学校通知,每天统计每个学生和同住人员的健康码、行程码,并且要合并到一张图上。
起初我觉得这用电脑自带的图片编辑器,不过是ctrl-c + ctrl-v的事嘛,对程序员来说,轻车熟路啊。然而打开我的macbook才发现,这图片编辑器也太难用了吧,根本找不到图片画布大小功能,翻箱倒柜找到我的老Windows,传图》保存到本地〉挨个编辑》加名字文本〉合并,忙活了10分钟,再说每次都要到电脑跟前也费事了。
作为一个有洁癖的码农,决不允许同样的流程化、重复的事件,在我的生活中冗余出现。
于是便有了下面的一键自动合成小程序。
实现效果如下:
WechatIMG33.jpeg
技术栈使用
采用了前后端分离的架构,别问我为啥不直接用js脚本处理图片。
前端
- Trao、Taro UI(功能比较简单,复杂的逻辑)
- Dva
- React
服务端
- Python
- flask
- docker (容器化部署,稳定省心)
- minio
- opencv
核心图片处理脚本
# 处理多个图片的拼接
def join_images(self, work_dir, image_list=[], flag='horizontal', max_height=1280): # 默认是水平参数
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
结语
功能还在不断完善中,主要先解决自身的使用问题,如果有什么建议欢迎留言反馈。