feat: utilitaires client heicConverter, bgRemover, imageRotator, zipImporter (TS)
Porte les 4 utilitaires de traitement d'images en TypeScript pour utilisation côté client : - heicConverter.ts : convertit HEIC/HEIF en JPEG via heic2any - bgRemover.ts : supprime les fonds d'images avec @imgly/background-removal + composite sur blanc - imageRotator.ts : pivote les images JPEG via Canvas - zipImporter.ts : extrait les images d'un fichier ZIP avec structure dossier-ref/image.ext Tous les modules utilisent des APIs du navigateur et doivent être importés dynamiquement depuis du code 'use client'. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* Convertit un Blob HEIC/HEIF en Blob JPEG via heic2any.
|
||||
* À utiliser uniquement côté client (navigateur).
|
||||
*/
|
||||
export async function convertHeicToJpeg(blob: Blob): Promise<Blob> {
|
||||
if (!(blob instanceof Blob)) {
|
||||
throw new TypeError('L\'entrée doit être un Blob')
|
||||
}
|
||||
|
||||
const type = blob.type.toLowerCase()
|
||||
if (type !== '' && !['image/heic', 'image/heif'].includes(type)) {
|
||||
throw new TypeError(`Format attendu : HEIC/HEIF. Reçu : ${blob.type || '(vide)'}`)
|
||||
}
|
||||
|
||||
const heic2any = (await import('heic2any')).default
|
||||
|
||||
const timeout = new Promise<never>((_, reject) =>
|
||||
setTimeout(() => reject(new Error('Timeout conversion HEIC (120s)')), 120_000),
|
||||
)
|
||||
|
||||
const conversion = heic2any({ blob, toType: 'image/jpeg', quality: 0.92 })
|
||||
|
||||
const result = await Promise.race([conversion, timeout])
|
||||
const output = Array.isArray(result) ? result[0] : result
|
||||
|
||||
if (!(output instanceof Blob)) {
|
||||
throw new Error("heic2any n'a pas retourné un Blob")
|
||||
}
|
||||
|
||||
return output
|
||||
}
|
||||
Reference in New Issue
Block a user