/** * Create a thumbnail from a File object by drawing it onto an OffscreenCanvas */export const createThumbnail = file => { return new Promise((resolve, reject) => { const img = new Image(); img.src = URL.createObjectURL(file); // Use Object URL directly img.onload = () => { const maxDimension = 280; let drawHeight, drawWidth; // Calculate aspect ratio const aspectRatio = img.width / img.height; // Determine dimensions to fit within maxDimension while maintaining aspect ratio if (aspectRatio > 1) { // Image is wider than tall drawWidth = maxDimension; drawHeight = maxDimension / aspectRatio; } else { // Image is taller than wide, or square drawWidth = maxDimension * aspectRatio; drawHeight = maxDimension; } const canvas = new OffscreenCanvas(drawWidth, drawHeight) // Create an OffscreenCanvas ; const ctx = canvas.getContext('2d'); // Determine output format based on input file type const outputFormat = file.type === 'image/png' ? 'image/png' : 'image/jpeg'; const quality = file.type === 'image/png' ? undefined : 0.8 // PNG doesn't use quality, use higher quality for JPEG ; // Draw the image onto the OffscreenCanvas with calculated dimensions ctx.drawImage(img, 0, 0, drawWidth, drawHeight); // Convert the OffscreenCanvas to a Blob and free up memory canvas.convertToBlob({ type: outputFormat, ...(quality && { quality }) }).then(blob => { URL.revokeObjectURL(img.src); // Release the Object URL const reader = new FileReader(); reader.onload = () => resolve(reader.result); // Resolve as data URL reader.onerror = reject; reader.readAsDataURL(blob); }).catch(reject); }; img.onerror = error => { URL.revokeObjectURL(img.src); // Release Object URL on error // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); }; }); }; //# sourceMappingURL=createThumbnail.js.map