呃……
多年文件占满了硬盘,有些文件包括工作的已经成了回忆,舍不得删除,得整理一下。于是一个个目录检查,删除过程文件,留下成品文件做个留念。翻到10年世博深圳馆的一个工程文件,画面是深圳卫星地图上找东西的效果,当时是用flash 做的,现在已经记不起是as2还是as3做的了。啊~~!也有多年没有打as3代码了,想起那些日积月累写下来的类,也成了纪念品了。跑题了,呃……功能就是把切割成无数小块图片的地图,当前窗口位置检测显示地图区域去加载对应的小图们。这个切图的功臣当时用的是一款名为splitz.exe工具软件,把上万像素的图分成了256px的方块图。人们常说上年纪了爱回忆……于是从g盘的software目录里找到还保存的这工具,想点开回忆一下。结果是打不开了,发现是换了win10系统兼容问题。哎……
好吧,该死的疫情,电影都看腻了。突然想着用什么办法快速做个这类似的工具呢?js+canvas想想就感觉太费劲了,用Python吧,自做了几个爬虫下载了少量的颜色图,感觉效率挺高的,于是就有了下面这些东西。
效果截图
运行画面
切好的图文件
生成的json文件
生成的html预览文件
EXE程序
已经打包好的exe执行文件,不想继续浪费精力的其它切图需求者只想使用现成工具的传送门
代码
import os
import sys
import cv2
import math
import time
def split_image(img_name, img_size):
if img_name.split('.')[1].lower()=='jpg':
img_params=[cv2.IMWRITE_JPEG_QUALITY,70]
else:
img_params=[cv2.IMWRITE_PNG_COMPRESSION,2]
img = cv2.imread(img_name,-1)
size = img.shape[0:2]
w = size[1]
h = size[0]
#计算切图的行,列数
rownum = math.ceil(h / img_size)
colnum = math.ceil(w / img_size)
sub_dir=img_name.split('.')[0]
#是否存在目标而创建文件夹
if not os.path.exists(sub_dir):
os.mkdir(sub_dir)
begin = time.time()#记录开始时间
# 保存数据到imgmatrix.json 文件里。用于第三方通过json读取所有切割图片
if os.path.exists(sub_dir + '/' + 'imgmatrix.json'):
os.remove(sub_dir + '/' + 'imgmatrix.json')
with open(sub_dir + '/' + 'imgmatrix.json','a+') as fw:
fw.write('{\n"images":[\n')
fw.close()
# 保存为预览的html 文件。
img_css_w=img_size/w*100
if os.path.exists(sub_dir + '/' + 'preview.html'):
os.remove(sub_dir + '/' + 'preview.html')
with open(sub_dir + '/' + 'preview.html','a+',encoding='utf-8') as fw:
fw.write('<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=0.5"><title>切图预览preview</title></head><body style="font-size:0;background-color:#035;margin:0;"><div style="position:fixed;bottom:0;margin:auto;left:0;right:0;font-size:xx-small;color:#fff;text-align:center;padding:8px;">© <a style="font-size:xx-small;color:#fff;text-decoration:none;" href="https://blog.csdn.net/mythl?type=blog">MYTHLONG</a></div>')
fw.close()
for i in range(rownum):
with open(sub_dir + '/' + 'imgmatrix.json','a+') as fw:
fw.write('[')
fw.close()
with open(sub_dir + '/' + 'preview.html','a+',encoding='utf-8') as fw:
# fw.write('<div style="width:'+str(colnum*img_size)+'px;">')
fw.write('<div>')
fw.close()
for j in range(colnum):
# 保存切割的图片的路径
filenm = sub_dir +'_' + str(i) + '_' + str(j) + '.' + img_name.split('.')[1]
save_path = sub_dir + '/' + filenm
row_start = j * img_size
row_end = (j+1) * img_size
col_start = i * img_size
col_end = (i+1) * img_size
# 切的小图片
child_img = img[col_start:col_end, row_start:row_end]
cv2.imwrite(save_path, child_img,img_params)
with open(sub_dir + '/' + 'imgmatrix.json','a+') as fw:
if j < colnum -1:
fw.write('{"url":"'+ save_path +'","x":'+ str(row_start) +',"y":'+ str(col_start) +'},')
else:
fw.write('{"url":"'+ save_path +'","x":'+ str(row_start) +',"y":'+ str(col_start) +'}')
fw.close()
with open(sub_dir + '/' + 'preview.html','a+',encoding='utf-8') as fw:
# fw.write('<img src="'+ filenm +'">')
if j < colnum -1:
fw.write('<img src="'+ filenm +'" style="width:'+str(img_css_w)+'%;max-width:'+str(img_size)+'px;">')
else:
fw.write('<img src="'+ filenm +'" style="width:'+str((w-row_start)/w*100)+'%;max-width:'+str(w-row_start)+'px;">')
fw.close()
with open(sub_dir + '/' + 'imgmatrix.json','a+') as fw:
if i < rownum -1:
fw.write('],\n')
else:
fw.write(']\n')
fw.close()
with open(sub_dir + '/' + 'preview.html','a+',encoding='utf-8') as fw:
fw.write('</div>')
fw.close()
with open(sub_dir + '/' + 'imgmatrix.json','a+') as fw:
fw.write(']\n}')
fw.close()
with open(sub_dir + '/' + 'preview.html','a+',encoding='utf-8') as fw:
fw.write('</body></html>')
fw.close()
print('\n')
times = time.time() - begin #记录线程完成时间
print(' 切图完毕,文件存放在:'+ sub_dir +' 目录里。\n 总消耗时间:'+str(round(times,2))+'秒 ')
if __name__ == '__main__':
img_name = ''
# img_name = 'img1.jpg'
# img_name = 'img2.png'
img_size = 512
print('\n')
print(' 参数说明:脚本名 [图片文件名(必须) 切割成小图大小(可选,不添加默认512px)] ')
print('\n')
print(' 如打开CMD(终端命令)模式输入:splitimg.py xxx.jpg 256 ')
print('\n')
print(' 作者:Mythlong 问题反馈:myth_long@qq.com PS:仅供学习。')
if len(sys.argv)>1:
img_name=(sys.argv[1])
else:
print('\n')
print('亲,没有添加图片文件名(后辍扩展名也要),请在下方输入:')
img_name=input()
if len(sys.argv)>2:
img_size=int(sys.argv[2])
split_image(img_name, img_size)
(代码不美观有冗余的请指正) 完。
新年快乐~