【Python 大图切割指定尺寸多个图片生成html预览和JSON文件】

呃……

         多年文件占满了硬盘,有些文件包括工作的已经成了回忆,舍不得删除,得整理一下。于是一个个目录检查,删除过程文件,留下成品文件做个留念。翻到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;">&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)  

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

         新年快乐~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

myth long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>