const fs = require('fs') const Jimp = require('jimp') const webp = require('webp-converter'); async function convertToWebP(inputPath) { try { if (!fs.existsSync(inputPath)) { throw new Error(`File doesn't exist: ${inputPath}`); } const outputWebp = inputPath.replace(/\.png$/, '.webp'); await webp.cwebp(inputPath, outputWebp, "-lossless", "-mt"); return outputWebp; } catch (err) { console.error(`[convertToWebP] Error: ${err.message}`); return null; } } async function cleanImage(inputPath, outputPath, threshold = 150) { if (!fs.existsSync(inputPath)) return false try { const img = await Jimp.read(inputPath) const { width, height } = img.bitmap const leftEx = Math.floor(width * 0.10) const rightEx = Math.floor(width * 0.90) const topEx = Math.floor(height * 0.10) const bottomEx = Math.floor(height * 0.90) let minX = width, minY = height, maxX = 0, maxY = 0 const bgR = 0, bgG = 255, bgB = 0 img.scan(0, 0, width, height, (x, y, idx) => { if (x < leftEx || x > rightEx || y < topEx || y > bottomEx) { img.bitmap.data[idx + 3] = 0 return } const r = img.bitmap.data[idx] const g = img.bitmap.data[idx + 1] const b = img.bitmap.data[idx + 2] const dist = Math.sqrt((r - bgR) ** 2 + (g - bgG) ** 2 + (b - bgB) ** 2) if (dist < threshold) { img.bitmap.data[idx + 3] = 0 } else { if (x < minX) minX = x if (y < minY) minY = y if (x > maxX) maxX = x if (y > maxY) maxY = y } }) if (maxX > minX && maxY > minY) { const w = maxX - minX + 1 const h = maxY - minY + 1 const m = 0.05 const exW = Math.floor(w * m) const exH = Math.floor(h * m) const cX = Math.max(0, minX - exW) const cY = Math.max(0, minY - exH) const cW = Math.min(width - cX, w + exW * 2) const cH = Math.min(height - cY, h + exH * 2) img.crop(cX, cY, cW, cH) } await img.writeAsync(outputPath) await convertToWebP(outputPath) // Cancella l'immagine originale (non-webp) fs.unlinkSync(inputPath) return true } catch (e) { console.error(`[cleanImage] Error: ${e}`) return false } } exports('cleanImage', cleanImage);