Spaces:
Running
Running
async function cropImage(inputImage: string): Promise<{ croppedImage: string; x: number; y: number; width: number; height: number }> { | |
return new Promise((resolve, reject) => { | |
const img = new Image(); | |
img.src = inputImage; | |
img.onload = () => { | |
const canvas = document.createElement('canvas'); | |
const context = canvas.getContext('2d'); | |
if (!context) { | |
reject("Context is null"); | |
return; | |
} | |
canvas.width = img.width; | |
canvas.height = img.height; | |
context.drawImage(img, 0, 0, img.width, img.height); | |
const imageData = context.getImageData(0, 0, img.width, img.height); | |
const data = imageData.data; | |
let minX = img.width, minY = img.height, maxX = 0, maxY = 0; | |
for (let y = 0; y < img.height; y++) { | |
for (let x = 0; x < img.width; x++) { | |
const i = (y * 4) * img.width + x * 4; | |
const avg = (data[i] + data[i + 1] + data[i + 2]) / 3; | |
if (avg < 255) { | |
minX = Math.min(minX, x); | |
minY = Math.min(minY, y); | |
maxX = Math.max(maxX, x); | |
maxY = Math.max(maxY, y); | |
} | |
} | |
} | |
const width = maxX - minX; | |
const height = maxY - minY; | |
const croppedCanvas = document.createElement('canvas'); | |
croppedCanvas.width = width; | |
croppedCanvas.height = height; | |
const croppedCtx = croppedCanvas.getContext('2d'); | |
if (!croppedCtx) { | |
reject("croppedCtx is null"); | |
return; | |
} | |
croppedCtx.drawImage(canvas, minX, minY, width, height, 0, 0, width, height); | |
resolve({ | |
croppedImage: croppedCanvas.toDataURL(), | |
x: minX, | |
y: minY, | |
width, | |
height | |
}); | |
}; | |
img.onerror = reject; | |
}); | |
} |