w

API リファレンス

Image Cropper の機能を統合または拡張したい開発者向けの技術リファレンスです。

コアコンポーネント

ImageCropper コンポーネント

画像トリミングのインターフェースを提供するメインの Vue コンポーネント。

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

プロパティ (Props)

プロパティ型デフォルト説明
aspectRationumber | 'free''free'トリミングのアスペクト比の制約
outputFormat'png' | 'jpeg' | 'webp''png'出力画像の形式
qualitynumber[][85]JPEG の品質 (10-100)
maxWidthnumberundefined最大出力幅
maxHeightnumberundefined最大出力高さ

イベント (Events)

イベントペイロード説明
crop-completeCropResultトリミングが完了したときに発生
image-loadedImageInfoソース画像が読み込まれたときに発生
errorErrorエラーが発生したときに発生

型定義

CropResult

interface CropResult {
  url: string; // トリミングされた画像の Blob URL
  blob: Blob; // 画像の Blob データ
  canvas: HTMLCanvasElement; // Canvas 要素
  info: {
    width: number; // 出力幅(ピクセル)
    height: number; // 出力高さ(ピクセル)
    size: number; // ファイルサイズ(バイト)
    format: string; // 出力形式
  };
}

ImageInfo

interface ImageInfo {
  width: number; // 元の幅
  height: number; // 元の高さ
  size: number; // ファイルサイズ(バイト)
  type: string; // MIME タイプ
  name: string; // 元のファイル名
}

CropSettings

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

Cropper.js の統合

設定オプション

const cropperOptions = {
  aspectRatio: NaN, // 自由なアスペクト比
  viewMode: 1, // トリミングボックスをキャンバス内に制限
  responsive: true, // レスポンシブなトリミング
  restore: false, // リサイズ後に復元しない
  guides: true, // 破線を表示
  center: true, // 中央インジケーターを表示
  highlight: false, // トリミング領域をハイライトしない
  cropBoxMovable: true, // トリミングボックスの移動を許可
  cropBoxResizable: true, // トリミングボックスのサイズ変更を許可
  toggleDragModeOnDblclick: false, // ダブルクリックでの切り替えを無効化
};

メソッド

メソッドパラメータ戻り値説明
getCroppedCanvas()options?HTMLCanvasElementトリミング領域をキャンバスとして取得
setAspectRatio()ratio: numbervoidアスペクト比を変更
reset()-void元の状態にリセット
destroy()-voidインスタンスを破棄

ユーティリティ関数

ファイル処理

// ファイルから画像を読み込む
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 をファイルとしてダウンロード
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);
}

画像処理

// キャンバスを blob に変換
function canvasToBlob(canvas: HTMLCanvasElement, format: string, quality?: number): Promise<Blob> {
  return new Promise((resolve) => {
    canvas.toBlob(resolve, `image/${format}`, quality);
  });
}

// 画像の寸法を取得
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;
  });
}

フォーマット変換

// 表示用にファイルサイズをフォーマット
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];
}

// 画像ファイルを検証
function isValidImageFile(file: File): boolean {
  return file.type.startsWith("image/");
}

ブラウザの互換性

必要な API

  • Canvas API: 画像操作用
  • File API: ファイルアップロードの処理用
  • Blob API: 結果の生成用
  • URL.createObjectURL: 画像のプレビュー用
  • Clipboard API: コピー機能用 (オプション)

ブラウザのサポート

機能ChromeFirefoxSafariEdge
コア機能✅ 50+✅ 52+✅ 10+✅ 79+
WebP 出力✅ 32+✅ 65+✅ 14+✅ 79+
クリップボード API✅ 66+✅ 63+✅ 13.1+✅ 79+

エラー処理

一般的なエラーの種類

// ファイル検証エラー
class InvalidFileTypeError extends Error {
  constructor() {
    super("Invalid file type. Please select an image file.");
  }
}

// メモリエラー
class ImageTooLargeError extends Error {
  constructor() {
    super("Image is too large to process in this browser.");
  }
}

// 処理エラー
class CropProcessingError extends Error {
  constructor(message: string) {
    super(`Crop processing failed: ${message}`);
  }
}

エラーの回復

// グレースフルなエラー処理
function handleCropError(error: Error): void {
  if (error instanceof InvalidFileTypeError) {
    // ファイルタイプのエラーメッセージを表示
    showErrorMessage("Please select a valid image file");
  } else if (error instanceof ImageTooLargeError) {
    // 画像サイズの縮小を提案
    showErrorMessage("Image too large. Please use a smaller image");
  } else {
    // 一般的なエラー処理
    showErrorMessage("An error occurred. Please try again");
  }
}

パフォーマンスの最適化

メモリ管理

// リソースのクリーンアップ
function cleanup(): void {
  // blob URL を取り消す
  blobUrls.forEach((url) => URL.revokeObjectURL(url));

  // インスタンスを破棄
  if (cropper) {
    cropper.destroy();
    cropper = null;
  }

  // キャンバスの参照をクリア
  canvasRefs.length = 0;
}

大きな画像の処理

// 大きな画像を効率的に処理
function processLargeImage(canvas: HTMLCanvasElement): HTMLCanvasElement {
  const maxDimension = 4096; // ブラウザの制限
  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;
}
このページは役に立ちましたか?