Référence de l'API
Référence technique pour les développeurs souhaitant intégrer ou étendre les fonctionnalités de l'Image Cropper.
Le composant Vue principal qui fournit l'interface de recadrage d'image.
<template>
<ImageCropper
:aspect-ratio="aspectRatio"
:output-format="format"
:quality="quality"
@crop-complete="handleCropComplete"
/>
</template>
| Prop | Type | Par défaut | Description |
|---|
aspectRatio | number | 'free' | 'free' | Contrainte de format de recadrage |
outputFormat | 'png' | 'jpeg' | 'webp' | 'png' | Format de l'image de sortie |
quality | number[] | [85] | Qualité JPEG (10-100) |
maxWidth | number | undefined | Largeur de sortie maximale |
maxHeight | number | undefined | Hauteur de sortie maximale |
| Événement | Payload | Description |
|---|
crop-complete | CropResult | Déclenché lorsque le recadrage est terminé |
image-loaded | ImageInfo | Déclenché lorsque l'image source est chargée |
error | Error | Déclenché lorsqu'une erreur se produit |
interface CropResult {
url: string; // URL Blob de l'image recadrée
blob: Blob; // Données blob de l'image
canvas: HTMLCanvasElement; // Élément canvas
info: {
width: number; // Largeur de sortie en pixels
height: number; // Hauteur de sortie en pixels
size: number; // Taille du fichier en octets
format: string; // Format de sortie
};
}
interface ImageInfo {
width: number; // Largeur d'origine
height: number; // Hauteur d'origine
size: number; // Taille du fichier en octets
type: string; // Type MIME
name: string; // Nom de fichier d'origine
}
interface CropSettings {
aspectRatio: number | "free";
outputFormat: "png" | "jpeg" | "webp";
quality: number;
outputWidth?: number;
outputHeight?: number;
}
const cropperOptions = {
aspectRatio: NaN, // Format libre
viewMode: 1, // Restreint la zone de recadrage au canvas
responsive: true, // Recadreur réactif
restore: false, // Ne pas restaurer après redimensionnement
guides: true, // Afficher les lignes en pointillés
center: true, // Afficher l'indicateur central
highlight: false, // Ne pas mettre en surbrillance la zone de recadrage
cropBoxMovable: true, // Permettre le déplacement de la zone de recadrage
cropBoxResizable: true, // Permettre le redimensionnement de la zone de recadrage
toggleDragModeOnDblclick: false, // Désactiver le double-clic
};
| Méthode | Paramètres | Retour | Description |
|---|
getCroppedCanvas() | options? | HTMLCanvasElement | Obtenir la zone recadrée en tant que canvas |
setAspectRatio() | ratio: number | void | Modifier le format de l'image |
reset() | - | void | Réinitialiser à l'état d'origine |
destroy() | - | void | Détruire l'instance du recadreur |
// Charger l'image depuis un fichier
function loadImageFromFile(file: File): Promise<string> {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = (e) => resolve(e.target?.result as string);
reader.onerror = reject;
reader.readAsDataURL(file);
});
}
// Télécharger le blob en tant que fichier
function downloadBlob(blob: Blob, filename: string): void {
const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
}
// Convertir le canvas en blob
function canvasToBlob(canvas: HTMLCanvasElement, format: string, quality?: number): Promise<Blob> {
return new Promise((resolve) => {
canvas.toBlob(resolve, `image/${format}`, quality);
});
}
// Obtenir les dimensions de l'image
function getImageDimensions(src: string): Promise<{ width: number; height: number }> {
return new Promise((resolve) => {
const img = new Image();
img.onload = () =>
resolve({
width: img.naturalWidth,
height: img.naturalHeight,
});
img.src = src;
});
}
// Formater la taille du fichier pour l'affichage
function formatFileSize(bytes: number): string {
const sizes = ["Octets", "Ko", "Mo", "Go"];
if (bytes === 0) return "0 Octets";
const i = Math.floor(Math.log(bytes) / Math.log(1024));
return Math.round((bytes / Math.pow(1024, i)) * 100) / 100 + " " + sizes[i];
}
// Valider le fichier image
function isValidImageFile(file: File): boolean {
return file.type.startsWith("image/");
}
- API Canvas: Pour la manipulation d'images
- API File: Pour la gestion des téléchargements de fichiers
- API Blob: Pour la génération des résultats
- URL.createObjectURL: Pour l'aperçu de l'image
- API Clipboard: Pour la fonctionnalité de copie (facultatif)
| Fonctionnalité | Chrome | Firefox | Safari | Edge |
|---|
| Fonctionnalité de base | ✅ 50+ | ✅ 52+ | ✅ 10+ | ✅ 79+ |
| Sortie WebP | ✅ 32+ | ✅ 65+ | ✅ 14+ | ✅ 79+ |
| API Clipboard | ✅ 66+ | ✅ 63+ | ✅ 13.1+ | ✅ 79+ |
// Erreurs de validation de fichier
class InvalidFileTypeError extends Error {
constructor() {
super("Type de fichier invalide. Veuillez sélectionner un fichier image.");
}
}
// Erreurs de mémoire
class ImageTooLargeError extends Error {
constructor() {
super("L'image est trop grande pour être traitée dans ce navigateur.");
}
}
// Erreurs de traitement
class CropProcessingError extends Error {
constructor(message: string) {
super(`Le traitement du recadrage a échoué : ${message}`);
}
}
// Gestion gracieuse des erreurs
function handleCropError(error: Error): void {
if (error instanceof InvalidFileTypeError) {
// Afficher le message d'erreur du type de fichier
showErrorMessage("Veuillez sélectionner un fichier image valide");
} else if (error instanceof ImageTooLargeError) {
// Suggérer de réduire la taille de l'image
showErrorMessage("Image trop grande. Veuillez utiliser une image plus petite");
} else {
// Gestion générique des erreurs
showErrorMessage("Une erreur s'est produite. Veuillez réessayer");
}
}
// Nettoyer les ressources
function cleanup(): void {
// Révoquer les URL blob
blobUrls.forEach((url) => URL.revokeObjectURL(url));
// Détruire l'instance du recadreur
if (cropper) {
cropper.destroy();
cropper = null;
}
// Effacer les références du canvas
canvasRefs.length = 0;
}
// Traiter efficacement les grandes images
function processLargeImage(canvas: HTMLCanvasElement): HTMLCanvasElement {
const maxDimension = 4096; // Limite du navigateur
const scale = Math.min(maxDimension / canvas.width, maxDimension / canvas.height, 1);
if (scale < 1) {
const scaledCanvas = document.createElement("canvas");
scaledCanvas.width = canvas.width * scale;
scaledCanvas.height = canvas.height * scale;
const ctx = scaledCanvas.getContext("2d");
ctx.drawImage(canvas, 0, 0, scaledCanvas.width, scaledCanvas.height);
return scaledCanvas;
}
return canvas;
}