Image Cropper
画像のアップロード、プレビュー、クロップ機能を提供する Compound Component パターンのコンポーネント群です。実装者が Dialog や Popover で柔軟にラップできる設計になっています。
画像をクロップ
インストール
構造
ImageCropper は以下の3つの独立したコンポーネントで構成されています:
ImageCropper- 画像のクロップ UI(AvatarEditor + Slider + ボタン)ImageCropperFileSelector- ファイル選択とドロップゾーン機能ImageCropperPreview- 画像のプレビュー表示と削除ボタン
使い方
基本的な使い方(Dialog)
Popover で使用
カスタムプレビュー
ImageCropperFileSelector の children に任意の要素を渡すことで、カスタムプレビューを実装できます。
クロップなしで使用
クロップ機能が不要な場合は、ImageCropperFileSelector のみを使用できます。
React Hook Form と FormField で使用
React Hook Form と shadcn/ui の Form コンポーネントを使用して、フォームバリデーションと統合できます。
必須バリデーション付きフォーム
画像を必須フィールドにする場合:
カスタムバリデーション
画像のファイルサイズや形式を検証する場合:
コンポーネント
ImageCropper
画像のクロップ UI を提供するコンポーネント。Dialog や Popover でラップして使用します。
Props
| Name | Type | Description |
|---|---|---|
| image | File | string | クロップする画像ファイル |
| canvasWidth | number | キャンバスの横幅(ピクセル)。デフォルト: 400 |
| aspectRatio | number | 画像のアスペクト比。デフォルト: 1 |
| resultWidth | number | クロップ後の横幅(ピクセル) |
| onCrop | (dataUrl: string, blob: Blob) => void | クロップ完了時のコールバック |
| onCancel | () => void | キャンセル時のコールバック |
onCrop の返り値
dataUrl: JPEG 形式の Data URL。プレビュー表示に使用blob: JPEG 形式の Blob。サーバーへのアップロードに使用
ImageCropperFileSelector
ファイル選択とドロップゾーン機能を提供するコンポーネント。常にドラッグ&ドロップが有効です。
Props
| Name | Type | Description |
|---|---|---|
| onFileSelect | (file: File) => void | ファイルが選択された時のコールバック |
| maxSize | number | 入力画像の最大サイズ(バイト)。デフォルト: 4MB |
| className | string | カスタムクラス名(width と aspect-ratio を含む)。デフォルト: "w-full aspect-square" |
| disabled | boolean | 無効化フラグ |
| children | React.ReactNode | 子要素(プレビューなど) |
children の扱い
childrenがある場合: それを表示(プレビュー画像など)childrenがない場合: デフォルトの ImagePlus アイコンを表示
ImageCropperPreview
画像のプレビュー表示と削除ボタンを提供するコンポーネント。
Props
| Name | Type | Description |
|---|---|---|
| src | string | プレビュー画像の URL |
| alt | string | 代替テキスト |
| onRemove | () => void | 削除ボタンが押された時のコールバック |
| showRemoveButton | boolean | 削除ボタンを表示するか。デフォルト: true |
アスペクト比の例
サーバーへのアップロード
Blob を使用してサーバーにアップロードする例:
実装のヒント
画像の品質とサイズ
resultWidth を適切に設定することで、画像のサイズと品質をコントロールできます:
ファイルサイズ制限
maxSize prop で受け入れるファイルサイズを制限できます:
ドラッグ&ドロップの視覚フィードバック
ImageCropperFileSelector は自動的にドラッグ中の視覚フィードバックを提供します。カスタマイズする場合は、CSS で border-primary や bg-primary/10 を調整してください。
使用例
- プロフィール画像のアップロード
- 商品画像の登録
- カバー画像の設定
- アバター画像の編集
- SNS 投稿の画像選択
参考
- react-avatar-editor - クロップ機能のベースライブラリ
- react-dropzone - ドロップゾーン機能のベースライブラリ