w

API Referansı

Görüntü Kırpıcı (Image Cropper) işlevselliğini entegre etmek veya genişletmek isteyen geliştiriciler için teknik referans.

Temel Bileşenler

ImageCropper Bileşeni

Görüntü kırpma arayüzünü sağlayan ana Vue bileşeni.

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

Proplar (Props)

PropTürVarsayılanAçıklama
aspectRationumber | 'free''free'Kırpma en-boy oranı kısıtlaması
outputFormat'png' | 'jpeg' | 'webp''png'Çıktı görüntü formatı
qualitynumber[][85]JPEG kalitesi (10-100)
maxWidthnumberundefinedMaksimum çıktı genişliği
maxHeightnumberundefinedMaksimum çıktı yüksekliği

Olaylar (Events)

OlayYük (Payload)Açıklama
crop-completeCropResultKırpma işlemi tamamlandığında tetiklenir
image-loadedImageInfoKaynak görüntü yüklendiğinde tetiklenir
errorErrorBir hata oluştuğunda tetiklenir

Tür Tanımlamaları

CropResult

interface CropResult {
  url: string; // Kırpılan görüntünün Blob URL'si
  blob: Blob; // Görüntü blob verisi
  canvas: HTMLCanvasElement; // Canvas öğesi
  info: {
    width: number; // Piksel cinsinden çıktı genişliği
    height: number; // Piksel cinsinden çıktı yüksekliği
    size: number; // Bayt cinsinden dosya boyutu
    format: string; // Çıktı formatı
  };
}

ImageInfo

interface ImageInfo {
  width: number; // Orijinal genişlik
  height: number; // Orijinal yükseklik
  size: number; // Bayt cinsinden dosya boyutu
  type: string; // MIME türü
  name: string; // Orijinal dosya adı
}

CropSettings

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

Cropper.js Entegrasyonu

Yapılandırma Seçenekleri

const cropperOptions = {
  aspectRatio: NaN, // Serbest en-boy oranı
  viewMode: 1, // Kırpma kutusunu tuvale kısıtla
  responsive: true, // Duyarlı cropper
  restore: false, // Yeniden boyutlandırmadan sonra geri yükleme yapma
  guides: true, // Kesik çizgileri göster
  center: true, // Merkez göstergesini göster
  highlight: false, // Kırpma alanını vurgulama
  cropBoxMovable: true, // Kırpma kutusunu taşımaya izin ver
  cropBoxResizable: true, // Kırpma kutusunu yeniden boyutlandırmaya izin ver
  toggleDragModeOnDblclick: false, // Çift tıklamayı devre dışı bırak
};

Yöntemler (Methods)

YöntemParametrelerDönüşAçıklama
getCroppedCanvas()options?HTMLCanvasElementKırpılan alanı tuval olarak al
setAspectRatio()ratio: numbervoidEn-boy oranını değiştir
reset()-voidOrijinal duruma sıfırla
destroy()-voidCropper örneğini yok et

Yardımcı İşlevler (Utility Functions)

Dosya İşleme

// Dosyadan görüntü yükle
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);
  });
}

// Blob'u dosya olarak indir
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);
}

Görüntü İşleme

// Tuvali blob'a dönüştür
function canvasToBlob(canvas: HTMLCanvasElement, format: string, quality?: number): Promise<Blob> {
  return new Promise((resolve) => {
    canvas.toBlob(resolve, `image/${format}`, quality);
  });
}

// Görüntü boyutlarını al
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;
  });
}

Format Dönüştürme

// Görüntüleme için dosya boyutunu biçimlendir
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];
}

// Görüntü dosyasını doğrula
function isValidImageFile(file: File): boolean {
  return file.type.startsWith("image/");
}

Tarayıcı Uyumluluğu

Gerekli API'ler

  • Canvas API: Görüntü manipülasyonu için
  • File API: Dosya yükleme işlemleri için
  • Blob API: Sonuç oluşturma için
  • URL.createObjectURL: Görüntü önizlemesi için
  • Clipboard API: Kopyalama işlevselliği için (isteğe bağlı)

Tarayıcı Desteği

ÖzellikChromeFirefoxSafariEdge
Temel işlevsellik✅ 50+✅ 52+✅ 10+✅ 79+
WebP çıktısı✅ 32+✅ 65+✅ 14+✅ 79+
Clipboard API✅ 66+✅ 63+✅ 13.1+✅ 79+

Hata Yönetimi

Yaygın Hata Türleri

// Dosya doğrulama hataları
class InvalidFileTypeError extends Error {
  constructor() {
    super("Geçersiz dosya türü. Lütfen bir görüntü dosyası seçin.");
  }
}

// Bellek hataları
class ImageTooLargeError extends Error {
  constructor() {
    super("Görüntü bu tarayıcıda işlenmek için çok büyük.");
  }
}

// İşleme hataları
class CropProcessingError extends Error {
  constructor(message: string) {
    super(`Kırpma işlemi başarısız oldu: ${message}`);
  }
}

Hata Kurtarma

// Zarif hata yönetimi
function handleCropError(error: Error): void {
  if (error instanceof InvalidFileTypeError) {
    // Dosya türü hata mesajını göster
    showErrorMessage("Lütfen geçerli bir görüntü dosyası seçin");
  } else if (error instanceof ImageTooLargeError) {
    // Görüntü boyutu küçültme önerisi
    showErrorMessage("Görüntü çok büyük. Lütfen daha küçük bir görüntü kullanın");
  } else {
    // Genel hata yönetimi
    showErrorMessage("Bir hata oluştu. Lütfen tekrar deneyin");
  }
}

Performans Optimizasyonu

Bellek Yönetimi

// Kaynakları temizle
function cleanup(): void {
  // Blob URL'lerini iptal et
  blobUrls.forEach((url) => URL.revokeObjectURL(url));

  // Cropper örneğini yok et
  if (cropper) {
    cropper.destroy();
    cropper = null;
  }

  // Tuval referanslarını temizle
  canvasRefs.length = 0;
}

Büyük Görüntü İşleme

// Büyük görüntüleri verimli bir şekilde işle
function processLargeImage(canvas: HTMLCanvasElement): HTMLCanvasElement {
  const maxDimension = 4096; // Tarayıcı sınırı
  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;
}
Bu sayfa yardımcı oldu mu?