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; }); }