81 lines
		
	
	
		
			No EOL
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			No EOL
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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); | 
