const sizeOf = require('image-size'); const _ = require('lodash'); const jimp = require('jimp'); const progress = require('progress'); const fs = require('fs'); let pngList = fs.readdirSync('./respng') // 该函数是一个异步函数,用于将指定路径下的PNG图片按照一定规则进行切割,并保存为多个小图。 // 该函数使用了sizeOf函数来获取图片的大小,使用了jimp库来进行图片的裁剪和保存操作,还使用了lodash库来克隆图片对象。 async function cutPng() { for (let layer = 0; layer < pngList.length; layer++) { let urlStr = `./respng/${pngList[layer]}` const currentImageInfo = sizeOf(urlStr) // 加载一张图,获取图片的高度和宽度。 let clientHeight = currentImageInfo.height let clientWidth = currentImageInfo.width const heights = [] const widths = [] const SPLIT_HEIGHT = 256 // 根据高度和宽度计算出需要切割的行数和列数。 while (clientHeight > 0) { // 切图高度充足时 if (clientHeight >= SPLIT_HEIGHT) { heights.push(SPLIT_HEIGHT) clientHeight -= SPLIT_HEIGHT } else { // 切割高度不够时,直接切成一张 heights.push(clientHeight) clientHeight = 0 } } while (clientWidth > 0) { // 切图宽度充足时 if (clientWidth >= SPLIT_HEIGHT) { widths.push(SPLIT_HEIGHT) clientWidth -= SPLIT_HEIGHT } else { // 切割宽度不够时,直接切成一张 widths.push(clientWidth) clientWidth = 0 } } let counti = 0 let countiNumber = 0 let savePngArr = [] for (let i of widths) { let conutj = 0 let conutjNumber = 0 for (let j of heights) { savePngArr.push({ z: layer, x: counti, y: conutj, countiNumber, conutjNumber, width: i, height: j, }) conutj++ conutjNumber += j } counti++ countiNumber += i } let conutBar = savePngArr.length let bar = new progress(':bar :current/:total', { total: conutBar }); let imageAll = await jimp.read(urlStr) for (let i = 0; i < conutBar; i++) { let imageTemp = _.cloneDeep(imageAll) let elei = savePngArr[i]; let cropTemp = imageTemp.crop(elei.countiNumber, elei.conutjNumber, elei.width, elei.height) //保存图片 cropTemp.write(`./dealpng/${elei.z}/${elei.x}/${elei.y}.png`) bar.tick(); } } console.log(8774, "切割结束") } cutPng()