w

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.

Composants Principaux

Composant ImageCropper

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>

Props

PropTypePar défautDescription
aspectRationumber | 'free''free'Contrainte de format de recadrage
outputFormat'png' | 'jpeg' | 'webp''png'Format de l'image de sortie
qualitynumber[][85]Qualité JPEG (10-100)
maxWidthnumberundefinedLargeur de sortie maximale
maxHeightnumberundefinedHauteur de sortie maximale

Événements

ÉvénementPayloadDescription
crop-completeCropResultDéclenché lorsque le recadrage est terminé
image-loadedImageInfoDéclenché lorsque l'image source est chargée
errorErrorDéclenché lorsqu'une erreur se produit

Définitions de Type

CropResult

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
  };
}

ImageInfo

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
}

CropSettings

interface CropSettings {
  aspectRatio: number | "free";
  outputFormat: "png" | "jpeg" | "webp";
  quality: number;
  outputWidth?: number;
  outputHeight?: number;
}

Intégration de Cropper.js

Options de Configuration

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éthodes

MéthodeParamètresRetourDescription
getCroppedCanvas()options?HTMLCanvasElementObtenir la zone recadrée en tant que canvas
setAspectRatio()ratio: numbervoidModifier le format de l'image
reset()-voidRéinitialiser à l'état d'origine
destroy()-voidDétruire l'instance du recadreur

Fonctions Utilitaires

Gestion des Fichiers

// 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);
}

Traitement d'Image

// 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;
  });
}

Conversion de Format

// 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/");
}

Compatibilité du Navigateur

API Requises

  • 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)

Prise en charge des Navigateurs

FonctionnalitéChromeFirefoxSafariEdge
Fonctionnalité de base✅ 50+✅ 52+✅ 10+✅ 79+
Sortie WebP✅ 32+✅ 65+✅ 14+✅ 79+
API Clipboard✅ 66+✅ 63+✅ 13.1+✅ 79+

Gestion des Erreurs

Types d'Erreurs Courants

// 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}`);
  }
}

Récupération d'Erreur

// 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");
  }
}

Optimisation des Performances

Gestion de la Mémoire

// 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;
}

Traitement des Grandes Images

// 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;
}
Cette page vous a-t-elle été utile ?