我是靠谱客的博主 默默纸飞机,这篇文章主要介绍【Python 大图切割指定尺寸多个图片生成html预览和JSON文件】,现在分享给大家,希望可以做个参考。

呃……

         多年文件占满了硬盘,有些文件包括工作的已经成了回忆,舍不得删除,得整理一下。于是一个个目录检查,删除过程文件,留下成品文件做个留念。翻到10年世博深圳馆的一个工程文件,画面是深圳卫星地图上找东西的效果,当时是用flash 做的,现在已经记不起是as2还是as3做的了。啊~~!也有多年没有打as3代码了,想起那些日积月累写下来的类,也成了纪念品了。跑题了,呃……功能就是把切割成无数小块图片的地图,当前窗口位置检测显示地图区域去加载对应的小图们。这个切图的功臣当时用的是一款名为splitz.exe工具软件,把上万像素的图分成了256px的方块图。人们常说上年纪了爱回忆……于是从g盘的software目录里找到还保存的这工具,想点开回忆一下。结果是打不开了,发现是换了win10系统兼容问题。哎……

        好吧,该死的疫情,电影都看腻了。突然想着用什么办法快速做个这类似的工具呢?js+canvas想想就感觉太费劲了,用Python吧,自做了几个爬虫下载了少量的颜色图,感觉效率挺高的,于是就有了下面这些东西。

效果截图

运行画面        

切好的图文件

生成的json文件

生成的html预览文件

EXE程序 

        已经打包好的exe执行文件,不想继续浪费精力的其它切图需求者只想使用现成工具的传送门

代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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;">&copy; <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)

(代码不美观有冗余的请指正) 完。

         新年快乐~

最后

以上就是默默纸飞机最近收集整理的关于【Python 大图切割指定尺寸多个图片生成html预览和JSON文件】的全部内容,更多相关【Python内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部