From e934e944f5258e71dbb58305096589cd82d804b2 Mon Sep 17 00:00:00 2001 From: LCJ-MinYa <1049468118@qq.com> Date: Mon, 14 Oct 2024 15:53:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=95=86=E5=93=81=E4=B8=BB=E5=9B=BE?= =?UTF-8?q?=E8=83=8C=E6=99=AF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 5 +-- src/product_main_img_bg.js | 74 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 src/product_main_img_bg.js diff --git a/package.json b/package.json index 630147d..94b3751 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,9 @@ "ppt": "node ./src/ppt_to_img.js", "merge": "node ./src/img_merge.js", "water": "node ./src/water_market.js", - "pptToImg": "npm run ppt && npm run merge && npm run water && npm run cover", - "pyToImg": "npm run merge && npm run water && npm run cover" + "bg": "node ./src/product_main_img_bg.js", + "pptToImg": "npm run ppt && npm run merge && npm run water && npm run cover && npm run bg", + "pyToImg": "npm run merge && npm run water && npm run cover && npm run bg" }, "author": "", "license": "ISC", diff --git a/src/product_main_img_bg.js b/src/product_main_img_bg.js new file mode 100644 index 0000000..02b6f0f --- /dev/null +++ b/src/product_main_img_bg.js @@ -0,0 +1,74 @@ +const sharp = require('sharp'); +const fs = require('fs'); +const path = require('path'); +const { getInputDir } = require('../utils/index'); +const { cover } = require('../config/index'); + +//工作目录文件夹路径 +let inputDir = getInputDir(); +const scaleDir = `${inputDir}/1x1`; +if (!inputDir || !scaleDir) { + console.log('未执行拼接商品主图背景功能,工作目录不存在'); + return; +} + +async function mergeMainImgBg(folderPath, row = 2) { + const images = fs.readdirSync(folderPath); + const imagePaths = images + .map((image) => path.join(folderPath, image)) + .filter((img) => { + // 这里使用Array.from将Set类型转为数组 + return Array.from(cover.imgFormat).some((item) => img.endsWith(item)); + }); + + // 删除之前生成的商品主图背景 + imagePaths.some((item, index) => { + if (item.endsWith('商品主图背景.png')) { + fs.rmSync(item, { force: true }); + imagePaths.splice(index, 1); + return true; + } + }); + + if (imagePaths.length < 4) { + console.log(`当前1x1文件夹下少于4张图片`); + return; + } + + //去掉多余的图片,只需要4张来拼背景 + imagePaths.length = 4; + // 处理剩余的图片 + const remainingImagesInfo = await Promise.all( + imagePaths.map(async (imagePath) => { + const { data, info } = await sharp(imagePath).resize({ width: 1000, fit: 'inside' }).toBuffer({ resolveWithObject: true }); + return { data, info }; // 返回图片数据及其高度 + }) + ); + // 获取第一张图片的高度 + const { width, height } = remainingImagesInfo[0].info; + const outputImagePath = path.join(folderPath, `商品主图背景.png`); + await sharp({ + create: { + width: width * 2, // 宽度使用第一张图片的宽度 + height: height * 2, // 高度为两张图片的总高度 + channels: 4, + background: { r: 255, g: 255, b: 255, alpha: 0 }, // 背景透明 + }, + }) + .composite([ + ...remainingImagesInfo.map(({ data, info }, index) => { + const currentRow = Math.floor(index / row); + const currentCol = index % row; + return { + input: data, + top: currentRow * info.height, // 计算纵向位置 + left: currentCol * info.width, // 计算横向位置 + }; + }), + ]) + .toFile(outputImagePath); + + console.log(`生成商品主图背景成功`); +} + +mergeMainImgBg(scaleDir);