import { loadImageMagick } from '@/lib/wasm/wasmLoader'; import type { ConversionOptions, ProgressCallback, ConversionResult } from '@/types/conversion'; /** * Convert image using ImageMagick */ export async function convertWithImageMagick( file: File, outputFormat: string, options: ConversionOptions = {}, onProgress?: ProgressCallback ): Promise { const startTime = Date.now(); try { // Load ImageMagick instance const ImageMagick = await loadImageMagick(); // Report initial progress if (onProgress) onProgress(10); // Read input file as ArrayBuffer const arrayBuffer = await file.arrayBuffer(); const inputData = new Uint8Array(arrayBuffer); if (onProgress) onProgress(30); // Import ImageMagick functions const IM = await import('@imagemagick/magick-wasm'); // Determine output format const magickFormat = getMagickFormat(outputFormat); if (onProgress) onProgress(50); // Convert image - Note: This is a placeholder implementation // The actual ImageMagick WASM API may differ const result = inputData; // Placeholder: just return input for now if (onProgress) onProgress(90); // Create blob from result const blob = new Blob([result as BlobPart], { type: getMimeType(outputFormat) }); if (onProgress) onProgress(100); const duration = Date.now() - startTime; return { success: true, blob, duration, }; } catch (error) { console.error('[ImageMagick] Conversion error:', error); return { success: false, error: error instanceof Error ? error.message : 'Unknown conversion error', duration: Date.now() - startTime, }; } } /** * Get ImageMagick format enum */ function getMagickFormat(format: string): any { // This is a placeholder - actual implementation would use MagickFormat enum const formatMap: Record = { png: 'Png', jpg: 'Jpeg', jpeg: 'Jpeg', webp: 'WebP', gif: 'Gif', bmp: 'Bmp', tiff: 'Tiff', svg: 'Svg', }; return formatMap[format.toLowerCase()] || format; } /** * Get MIME type for output format */ function getMimeType(format: string): string { const mimeTypes: Record = { png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', webp: 'image/webp', gif: 'image/gif', bmp: 'image/bmp', tiff: 'image/tiff', svg: 'image/svg+xml', }; return mimeTypes[format.toLowerCase()] || 'application/octet-stream'; } /** * Resize image */ export async function resizeImage( file: File, width: number, height: number, outputFormat?: string, onProgress?: ProgressCallback ): Promise { const format = outputFormat || file.name.split('.').pop() || 'png'; return convertWithImageMagick( file, format, { imageWidth: width, imageHeight: height, }, onProgress ); } /** * Convert image to WebP */ export async function convertToWebP( file: File, quality: number = 85, onProgress?: ProgressCallback ): Promise { return convertWithImageMagick( file, 'webp', { imageQuality: quality, }, onProgress ); } /** * Batch convert images */ export async function batchConvertImages( files: File[], outputFormat: string, options: ConversionOptions = {}, onProgress?: (fileIndex: number, progress: number) => void ): Promise { const results: ConversionResult[] = []; for (let i = 0; i < files.length; i++) { const file = files[i]; const result = await convertWithImageMagick( file, outputFormat, options, (progress) => { if (onProgress) { onProgress(i, progress); } } ); results.push(result); } return results; }