const MAX_DIMENSION = 640; export async function resizeImageForInference( imageSource: string ): Promise { return new Promise((resolve, reject) => { const img = new Image(); img.crossOrigin = 'anonymous'; img.onload = () => { let { width, height } = img; if (width <= MAX_DIMENSION && height <= MAX_DIMENSION) { if (imageSource.startsWith('data:')) { resolve(imageSource.split(',')[1]); } else { const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; const ctx = canvas.getContext('2d'); if (!ctx) { reject(new Error('Failed to get canvas context')); return; } ctx.drawImage(img, 0, 0); const dataUrl = canvas.toDataURL('image/jpeg', 0.95); resolve(dataUrl.split(',')[1]); } return; } const scale = Math.min(MAX_DIMENSION / width, MAX_DIMENSION / height); const newWidth = Math.round(width * scale); const newHeight = Math.round(height * scale); const canvas = document.createElement('canvas'); canvas.width = newWidth; canvas.height = newHeight; const ctx = canvas.getContext('2d'); if (!ctx) { reject(new Error('Failed to get canvas context')); return; } ctx.imageSmoothingEnabled = true; ctx.imageSmoothingQuality = 'high'; ctx.drawImage(img, 0, 0, newWidth, newHeight); const dataUrl = canvas.toDataURL('image/jpeg', 0.95); resolve(dataUrl.split(',')[1]); }; img.onerror = () => { reject(new Error('Failed to load image')); }; img.src = imageSource; }); } export async function fetchAndResizeImage(url: string): Promise { try { const response = await fetch(url); const blob = await response.blob(); const dataUrl = await new Promise((resolve) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result as string); reader.readAsDataURL(blob); }); return resizeImageForInference(dataUrl); } catch (error) { console.error('Failed to fetch and resize image:', error); throw error; } }