w

Referencia de API

Referencia técnica para desarrolladores que desean integrar o extender la funcionalidad de Image Cropper.

Componentes Principales

Componente ImageCropper

El componente principal de Vue que proporciona la interfaz para recortar imágenes.

<template>
  <ImageCropper
    :aspect-ratio="aspectRatio"
    :output-format="format"
    :quality="quality"
    @crop-complete="handleCropComplete"
  />
</template>

Props

PropTipoPor defectoDescripción
aspectRationumber | 'free''free'Restricción de relación de aspecto de recorte
outputFormat'png' | 'jpeg' | 'webp''png'Formato de imagen de salida
qualitynumber[][85]Calidad de JPEG (10-100)
maxWidthnumberundefinedAncho de salida máximo
maxHeightnumberundefinedAltura de salida máxima

Eventos

EventoPayloadDescripción
crop-completeCropResultSe dispara cuando se completa el recorte
image-loadedImageInfoSe dispara cuando se carga la imagen de origen
errorErrorSe dispara cuando ocurre un error

Definiciones de Tipo

CropResult

interface CropResult {
  url: string; // URL Blob de la imagen recortada
  blob: Blob; // Datos blob de la imagen
  canvas: HTMLCanvasElement; // Elemento canvas
  info: {
    width: number; // Ancho de salida en píxeles
    height: number; // Altura de salida en píxeles
    size: number; // Tamaño del archivo en bytes
    format: string; // Formato de salida
  };
}

ImageInfo

interface ImageInfo {
  width: number; // Ancho original
  height: number; // Altura original
  size: number; // Tamaño del archivo en bytes
  type: string; // Tipo MIME
  name: string; // Nombre de archivo original
}

CropSettings

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

Integración con Cropper.js

Opciones de Configuración

const cropperOptions = {
  aspectRatio: NaN, // Relación de aspecto libre
  viewMode: 1, // Restringe la caja de recorte al canvas
  responsive: true, // Recortador adaptable
  restore: false, // No restaurar después de cambiar el tamaño
  guides: true, // Mostrar líneas punteadas
  center: true, // Mostrar indicador central
  highlight: false, // No resaltar el área de recorte
  cropBoxMovable: true, // Permitir mover la caja de recorte
  cropBoxResizable: true, // Permitir cambiar el tamaño de la caja de recorte
  toggleDragModeOnDblclick: false, // Desactivar el doble clic
};

Métodos

MétodoParámetrosRetornoDescripción
getCroppedCanvas()options?HTMLCanvasElementObtener área recortada como canvas
setAspectRatio()ratio: numbervoidCambiar la relación de aspecto
reset()-voidRestablecer al estado original
destroy()-voidDestruir la instancia del recortador

Funciones de Utilidad

Manejo de Archivos

// Cargar imagen desde archivo
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);
  });
}

// Descargar blob como archivo
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);
}

Procesamiento de Imágenes

// Convertir canvas a blob
function canvasToBlob(canvas: HTMLCanvasElement, format: string, quality?: number): Promise<Blob> {
  return new Promise((resolve) => {
    canvas.toBlob(resolve, `image/${format}`, quality);
  });
}

// Obtener dimensiones de la imagen
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;
  });
}

Conversión de Formato

// Formatear el tamaño del archivo para mostrar
function formatFileSize(bytes: number): string {
  const sizes = ["Bytes", "KB", "MB", "GB"];
  if (bytes === 0) return "0 Bytes";
  const i = Math.floor(Math.log(bytes) / Math.log(1024));
  return Math.round((bytes / Math.pow(1024, i)) * 100) / 100 + " " + sizes[i];
}

// Validar archivo de imagen
function isValidImageFile(file: File): boolean {
  return file.type.startsWith("image/");
}

Compatibilidad de Navegadores

APIs Requeridas

  • Canvas API: Para la manipulación de imágenes
  • File API: Para el manejo de carga de archivos
  • Blob API: Para la generación de resultados
  • URL.createObjectURL: Para la vista previa de la imagen
  • Clipboard API: Para la funcionalidad de copia (opcional)

Soporte de Navegadores

CaracterísticaChromeFirefoxSafariEdge
Funcionalidad base✅ 50+✅ 52+✅ 10+✅ 79+
Salida WebP✅ 32+✅ 65+✅ 14+✅ 79+
Clipboard API✅ 66+✅ 63+✅ 13.1+✅ 79+

Manejo de Errores

Tipos de Errores Comunes

// Errores de validación de archivos
class InvalidFileTypeError extends Error {
  constructor() {
    super("Tipo de archivo inválido. Por favor, seleccione un archivo de imagen.");
  }
}

// Errores de memoria
class ImageTooLargeError extends Error {
  constructor() {
    super("La imagen es demasiado grande para ser procesada en este navegador.");
  }
}

// Errores de procesamiento
class CropProcessingError extends Error {
  constructor(message: string) {
    super(`El procesamiento del recorte falló: ${message}`);
  }
}

Recuperación de Errores

// Manejo elegante de errores
function handleCropError(error: Error): void {
  if (error instanceof InvalidFileTypeError) {
    // Mostrar mensaje de error de tipo de archivo
    showErrorMessage("Por favor, seleccione un archivo de imagen válido");
  } else if (error instanceof ImageTooLargeError) {
    // Sugerir reducción de tamaño de imagen
    showErrorMessage("Imagen demasiado grande. Por favor, use una imagen más pequeña");
  } else {
    // Manejo genérico de errores
    showErrorMessage("Ocurrió un error. Por favor, inténtelo de nuevo");
  }
}

Optimización de Rendimiento

Gestión de Memoria

// Limpiar recursos
function cleanup(): void {
  // Revocar URLs blob
  blobUrls.forEach((url) => URL.revokeObjectURL(url));

  // Destruir la instancia del recortador
  if (cropper) {
    cropper.destroy();
    cropper = null;
  }

  // Borrar referencias del canvas
  canvasRefs.length = 0;
}

Manejo de Imágenes Grandes

// Procesar imágenes grandes eficientemente
function processLargeImage(canvas: HTMLCanvasElement): HTMLCanvasElement {
  const maxDimension = 4096; // Límite del navegador
  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;
}
¿Te resultó útil esta página?