sharp
Node.jsのSharpライブラリを活用し、画像のリサイズや形式変換、圧縮、切り抜き、回転、透かし追加など、Web最適化を含む多様な画像処理を効率的に行うSkill。
📜 元の英語説明(参考)
Process and transform images with Sharp for Node.js. Use when a user asks to resize images, convert image formats (WebP, AVIF, PNG, JPEG), compress images, crop or rotate photos, generate thumbnails, add watermarks, optimize images for web, batch process images, create responsive image variants, extract image metadata, or build image processing pipelines. Covers resizing, format conversion, compression, cropping, compositing, and metadata extraction.
🇯🇵 日本人クリエイター向け解説
Node.jsのSharpライブラリを活用し、画像のリサイズや形式変換、圧縮、切り抜き、回転、透かし追加など、Web最適化を含む多様な画像処理を効率的に行うSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o sharp.zip https://jpskill.com/download/15380.zip && unzip -o sharp.zip && rm sharp.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15380.zip -OutFile "$d\sharp.zip"; Expand-Archive "$d\sharp.zip" -DestinationPath $d -Force; ri "$d\sharp.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
sharp.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
sharpフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Sharp
概要
Sharp は Node.js 向けの最速の画像処理ライブラリであり、libvips を基盤として構築されています。リサイズ、フォーマット変換 (JPEG, PNG, WebP, AVIF, TIFF, GIF)、圧縮、クロップ、回転、合成、メタデータ抽出を処理します。サムネイルの生成、レスポンシブな画像バリアント、Web 最適化、透かしの挿入、バッチ処理パイプラインにご利用ください。
手順
ステップ 1: インストール
npm install sharp
ステップ 2: リサイズと変換
// resize.js — 画像のリサイズとフォーマット間の変換
import sharp from 'sharp'
// 特定の寸法にリサイズ
await sharp('input.jpg')
.resize(800, 600) // width, height
.toFile('output.jpg')
// アスペクト比を維持したままリサイズ (境界内に収まるように)
await sharp('input.jpg')
.resize(800, 600, { fit: 'inside', withoutEnlargement: true })
.toFile('resized.jpg')
// JPEG を WebP に変換
await sharp('photo.jpg')
.webp({ quality: 80 })
.toFile('photo.webp')
// AVIF に変換 (最高の圧縮率、最新のブラウザ)
await sharp('photo.jpg')
.avif({ quality: 50 }) // AVIF の品質スケールは異なる — 50 ≈ JPEG 80
.toFile('photo.avif')
// 圧縮ありの PNG
await sharp('screenshot.png')
.png({ compressionLevel: 9, palette: true }) // ファイルサイズを小さくするためのパレットモード
.toFile('optimized.png')
ステップ 3: レスポンシブな画像バリアントの生成
// responsive.js — srcset 用に複数のサイズを生成
import sharp from 'sharp'
const sizes = [320, 640, 960, 1280, 1920] // 一般的なブレークポイント
async function generateVariants(inputPath, outputDir) {
/**
* WebP と JPEG フォールバックでレスポンシブな画像バリアントを生成します。
* 引数:
* inputPath: ソース画像のパス
* outputDir: 出力バリアントのディレクトリ
*/
const image = sharp(inputPath)
const metadata = await image.metadata()
const baseName = inputPath.replace(/\.[^.]+$/, '').split('/').pop()
for (const width of sizes) {
if (width > metadata.width) continue // アップスケールしない
// WebP バリアント (プライマリ)
await sharp(inputPath)
.resize(width)
.webp({ quality: 80 })
.toFile(`${outputDir}/${baseName}-${width}w.webp`)
// JPEG フォールバック
await sharp(inputPath)
.resize(width)
.jpeg({ quality: 80, progressive: true })
.toFile(`${outputDir}/${baseName}-${width}w.jpg`)
}
}
ステップ 4: クロップ、回転、および変換
// transform.js — クロップ、回転、反転、および領域の抽出
import sharp from 'sharp'
// 正方形に中央クロップ (アバター/サムネイル用)
await sharp('portrait.jpg')
.resize(300, 300, { fit: 'cover', position: 'centre' })
.toFile('avatar.jpg')
// 特定の領域を抽出
await sharp('photo.jpg')
.extract({ left: 100, top: 50, width: 500, height: 500 })
.toFile('cropped.jpg')
// 回転 (EXIF に基づく自動回転、または手動)
await sharp('photo.jpg')
.rotate() // EXIF の向きから自動回転
.toFile('rotated.jpg')
await sharp('photo.jpg')
.rotate(90) // 明示的な 90° 時計回り
.toFile('rotated90.jpg')
// 反転と左右反転
await sharp('photo.jpg').flip().toFile('flipped.jpg') // 垂直反転
await sharp('photo.jpg').flop().toFile('flopped.jpg') // 水平ミラー
ステップ 5: 透かしと合成
// watermark.js — 透かしのオーバーレイ、複数の画像の合成
import sharp from 'sharp'
// 透かしを追加
await sharp('photo.jpg')
.composite([{
input: 'watermark.png',
gravity: 'southeast', // 右下隅
blend: 'over',
}])
.toFile('watermarked.jpg')
// テキスト透かし (テキストを SVG として作成し、オーバーレイ)
const svgText = `
<svg width="400" height="50">
<text x="0" y="35" font-size="30" fill="white" opacity="0.5"
font-family="Arial">© 2025 My Company</text>
</svg>`
await sharp('photo.jpg')
.composite([{
input: Buffer.from(svgText),
gravity: 'south',
}])
.toFile('branded.jpg')
// 画像コラージュの作成 (キャンバス上に複数の画像)
await sharp({ create: { width: 1200, height: 600, channels: 3, background: '#ffffff' } })
.composite([
{ input: await sharp('img1.jpg').resize(400, 300).toBuffer(), left: 0, top: 0 },
{ input: await sharp('img2.jpg').resize(400, 300).toBuffer(), left: 400, top: 0 },
{ input: await sharp('img3.jpg').resize(400, 300).toBuffer(), left: 800, top: 0 },
])
.jpeg()
.toFile('collage.jpg')
ステップ 6: メタデータと分析
// metadata.js — 画像のメタデータと統計の抽出
import sharp from 'sharp'
const metadata = await sharp('photo.jpg').metadata()
console.log(metadata)
// { width: 4032, height: 3024, format: 'jpeg', space: 'srgb',
// channels: 3, depth: 'uchar', density: 72, hasAlpha: false,
// orientation: 1, exif: Buffer, icc: Buffer }
// 画像の統計を取得 (各チャンネルの最小値、最大値、平均値)
const stats = await sharp('photo.jpg').stats()
console.log(stats.channels[0]) // { min: 0, max: 255, sum: 12345678, mean: 128.5, ... }
// プライバシーのためにメタデータ (EXIF, ICC) を削除
await sharp('photo.jpg')
.rotate() // 最初に EXIF 回転を適用
.withMetadata({ orientation: undefined }) // EXIF を削除
.toFile('stripped.jpg')
ステップ 7: バッチ処理
// batch.js — ディレクトリ内のすべての画像を処理
import sharp from 'sharp'
import { readdir } from 'fs/promises'
import path from 'path'
async function optimizeDirectory(inputDir, outputDir, maxWidth = 1920) {
/**
* すべての画像をバッチで最適化: リサイズ、WebP に変換、圧縮。
* 引数:
* inputDir: 画像のあるソースディレクトリ
* outputDir: 最適化された画像の出力先
* maxWidth: 最大幅 (アスペクト比を維持)
*/
const files = await readdir(inputDir)
const imageFiles = files.filter(f => /\.(jpe?g|png|tiff?|webp)$/i.test(f))
let processed = 0
for (const file of imageFiles) {
const inputPath = path.join(inputDir, file)
const outputName = file.replace(/\.[^.]+$/, '.webp')
const outputPath = path. 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Sharp
Overview
Sharp is the fastest image processing library for Node.js, built on libvips. It handles resizing, format conversion (JPEG, PNG, WebP, AVIF, TIFF, GIF), compression, cropping, rotation, compositing, and metadata extraction. Use it for thumbnail generation, responsive image variants, web optimization, watermarking, and batch processing pipelines.
Instructions
Step 1: Installation
npm install sharp
Step 2: Resize and Convert
// resize.js — Resize images and convert between formats
import sharp from 'sharp'
// Resize to specific dimensions
await sharp('input.jpg')
.resize(800, 600) // width, height
.toFile('output.jpg')
// Resize maintaining aspect ratio (fit within bounds)
await sharp('input.jpg')
.resize(800, 600, { fit: 'inside', withoutEnlargement: true })
.toFile('resized.jpg')
// Convert JPEG to WebP
await sharp('photo.jpg')
.webp({ quality: 80 })
.toFile('photo.webp')
// Convert to AVIF (best compression, modern browsers)
await sharp('photo.jpg')
.avif({ quality: 50 }) // AVIF quality scale differs — 50 ≈ JPEG 80
.toFile('photo.avif')
// PNG with compression
await sharp('screenshot.png')
.png({ compressionLevel: 9, palette: true }) // palette mode for smaller files
.toFile('optimized.png')
Step 3: Generate Responsive Image Variants
// responsive.js — Generate multiple sizes for srcset
import sharp from 'sharp'
const sizes = [320, 640, 960, 1280, 1920] // common breakpoints
async function generateVariants(inputPath, outputDir) {
/**
* Generate responsive image variants in WebP and JPEG fallback.
* Args:
* inputPath: Source image path
* outputDir: Directory for output variants
*/
const image = sharp(inputPath)
const metadata = await image.metadata()
const baseName = inputPath.replace(/\.[^.]+$/, '').split('/').pop()
for (const width of sizes) {
if (width > metadata.width) continue // don't upscale
// WebP variant (primary)
await sharp(inputPath)
.resize(width)
.webp({ quality: 80 })
.toFile(`${outputDir}/${baseName}-${width}w.webp`)
// JPEG fallback
await sharp(inputPath)
.resize(width)
.jpeg({ quality: 80, progressive: true })
.toFile(`${outputDir}/${baseName}-${width}w.jpg`)
}
}
Step 4: Crop, Rotate, and Transform
// transform.js — Crop, rotate, flip, and extract regions
import sharp from 'sharp'
// Center crop to square (for avatars/thumbnails)
await sharp('portrait.jpg')
.resize(300, 300, { fit: 'cover', position: 'centre' })
.toFile('avatar.jpg')
// Extract specific region
await sharp('photo.jpg')
.extract({ left: 100, top: 50, width: 500, height: 500 })
.toFile('cropped.jpg')
// Rotate (auto-rotate based on EXIF, or manual)
await sharp('photo.jpg')
.rotate() // auto-rotate from EXIF orientation
.toFile('rotated.jpg')
await sharp('photo.jpg')
.rotate(90) // explicit 90° clockwise
.toFile('rotated90.jpg')
// Flip and flop
await sharp('photo.jpg').flip().toFile('flipped.jpg') // vertical flip
await sharp('photo.jpg').flop().toFile('flopped.jpg') // horizontal mirror
Step 5: Watermark and Compositing
// watermark.js — Overlay watermark, compose multiple images
import sharp from 'sharp'
// Add watermark
await sharp('photo.jpg')
.composite([{
input: 'watermark.png',
gravity: 'southeast', // bottom-right corner
blend: 'over',
}])
.toFile('watermarked.jpg')
// Text watermark (create text as SVG, then overlay)
const svgText = `
<svg width="400" height="50">
<text x="0" y="35" font-size="30" fill="white" opacity="0.5"
font-family="Arial">© 2025 My Company</text>
</svg>`
await sharp('photo.jpg')
.composite([{
input: Buffer.from(svgText),
gravity: 'south',
}])
.toFile('branded.jpg')
// Create image collage (multiple images on a canvas)
await sharp({ create: { width: 1200, height: 600, channels: 3, background: '#ffffff' } })
.composite([
{ input: await sharp('img1.jpg').resize(400, 300).toBuffer(), left: 0, top: 0 },
{ input: await sharp('img2.jpg').resize(400, 300).toBuffer(), left: 400, top: 0 },
{ input: await sharp('img3.jpg').resize(400, 300).toBuffer(), left: 800, top: 0 },
])
.jpeg()
.toFile('collage.jpg')
Step 6: Metadata and Analysis
// metadata.js — Extract image metadata and stats
import sharp from 'sharp'
const metadata = await sharp('photo.jpg').metadata()
console.log(metadata)
// { width: 4032, height: 3024, format: 'jpeg', space: 'srgb',
// channels: 3, depth: 'uchar', density: 72, hasAlpha: false,
// orientation: 1, exif: Buffer, icc: Buffer }
// Get image statistics (min, max, mean for each channel)
const stats = await sharp('photo.jpg').stats()
console.log(stats.channels[0]) // { min: 0, max: 255, sum: 12345678, mean: 128.5, ... }
// Strip metadata (EXIF, ICC) for privacy
await sharp('photo.jpg')
.rotate() // apply EXIF rotation first
.withMetadata({ orientation: undefined }) // strip EXIF
.toFile('stripped.jpg')
Step 7: Batch Processing
// batch.js — Process all images in a directory
import sharp from 'sharp'
import { readdir } from 'fs/promises'
import path from 'path'
async function optimizeDirectory(inputDir, outputDir, maxWidth = 1920) {
/**
* Batch optimize all images: resize, convert to WebP, compress.
* Args:
* inputDir: Source directory with images
* outputDir: Destination for optimized images
* maxWidth: Maximum width (maintains aspect ratio)
*/
const files = await readdir(inputDir)
const imageFiles = files.filter(f => /\.(jpe?g|png|tiff?|webp)$/i.test(f))
let processed = 0
for (const file of imageFiles) {
const inputPath = path.join(inputDir, file)
const outputName = file.replace(/\.[^.]+$/, '.webp')
const outputPath = path.join(outputDir, outputName)
const meta = await sharp(inputPath).metadata()
const pipeline = sharp(inputPath)
if (meta.width > maxWidth) {
pipeline.resize(maxWidth)
}
await pipeline.webp({ quality: 80 }).toFile(outputPath)
processed++
}
console.log(`Optimized ${processed} images`)
}
Examples
Example 1: Build an image upload pipeline for a web app
User prompt: "Users upload profile photos. I need to generate a 200x200 avatar thumbnail, a 800px wide display version, and a tiny 40x40 version for comments, all in WebP."
The agent will:
- Accept the upload buffer via
sharp(buffer). - Auto-rotate based on EXIF to handle phone photos.
- Generate three variants with
resize()+webp(), usingfit: 'cover'for the square crops. - Strip EXIF metadata for privacy.
- Return buffers or save to disk/S3.
Example 2: Optimize a website's image assets for performance
User prompt: "Our marketing site has 200+ images totaling 800MB. Optimize them — convert to WebP, resize anything over 1920px, and generate AVIF variants for modern browsers."
The agent will:
- Scan the images directory, read metadata for each file.
- Skip already-small images, resize large ones to max 1920px width.
- Generate WebP (quality 80) and AVIF (quality 50) variants.
- Report total size savings and per-file breakdown.
Guidelines
- Sharp is the fastest Node.js image library (10-100x faster than ImageMagick/GraphicsMagick via Node bindings). Prefer it for server-side image processing.
- Always call
.rotate()before other transforms when processing user uploads — it applies EXIF orientation, preventing rotated phone photos. - Use WebP (quality 80) as the default web format — it's 25-35% smaller than JPEG at equivalent quality and supported by all modern browsers.
- AVIF offers even better compression (50% smaller than JPEG) but encoding is slower. Use it for static assets, not real-time processing.
- Sharp operations are chainable and lazy — they only execute when you call
.toFile()or.toBuffer(). Chain all transforms before outputting. - For concurrent processing, Sharp uses a thread pool. It handles parallelism internally — you don't need to manage worker threads.
- Strip EXIF metadata from user uploads for privacy — photos from phones contain GPS coordinates, camera model, and timestamps.