開発者とアシスタントのためのローカル写真ツール
無料のバッチ透かし、ファイル名ラベル、日付スタンプ。機能を確認し、デバイス上で明示的に選択した写真を処理します。
マークダウンとして読む · OpenAPI 3.1 · レシピスキーマ
実行サーフェスを選択してください
ディスカバリー API はパブリック、無料、読み取り専用であり、API キーは必要ありません。ツールと設定について説明します。画像は決して受け付けません。 POST /ウォーターマーク、クラウド処理サービス、またはホストされた MCP エンドポイントはありません。
このオリジンで明示的に選択されたファイルにはブラウザ SDK を使用します。ローカル ファイル システムにアクセスできるアシスタントの場合、リポジトリの標準出力 MCP サーバーに明示的に接続し、ルート ディレクトリを承認します。このドキュメントを見つけたモデルは、デバイスまたはそのファイルにアクセスできません。
| 表面 | 目的 |
|---|---|
| JSON / マークダウンを取得 | 機能、レシピ、制約、ローカル ツールのシグネチャを確認します。 |
| ブラウザ ESM SDK | ファイルをローカルでデコードしてレンダリングします。 Canvas、DOM、createImageBitmap、および File/Blob が必要です。 Node またはリモート HTTP 処理 API ではありません。 |
| ローカル CLI / 標準出力 MCP | インストールされた Google Chrome とリポジトリの依存関係を使用して明示的に接続されたローカル オートメーション。 |
公共リソース
GET と HEAD は静的リソースを返します。認証、リクエスト本文、クエリパラメータ、ユーザーデータはありません。不明なリソース パスは 404 を返します。バージョン 1 を契約バージョンとして扱います。ハッシュ化されたビルド チャンクではなく正規パスをブックマークします。クロスオリジンのブラウザー アクセスは約束されていません。同一オリジンの SDK インポートを使用します。
- 機能カタログ
- 完全なデフォルトのレシピとサポートされているテキスト変数
- レシピ JSON Schema (2020-12)
- ローカル MCP 入力スキーマ
- OpenAPI 3.1 ディスカバリー仕様
- オプションの検出ディレクトリ
curl https://watermark.noxxxx.com/api/v1/capabilities.json
curl https://watermark.noxxxx.com/api/v1/recipes/filename.jsonブラウザ SDK
このサイトのオリジンに /sdk/watermark.js をインポートします。これは安定した ESM エントリ URL です。実装チャンクは変更される可能性があります。次の例は複数のファイル入力を想定しており、ユーザーがローカル ファイルを選択した後に実行されます。成功したコピーの ZIP が作成されます。呼び出し元は、部分的なエクスポートを完了したものとして扱うのではなく、failures と cancelled を検査する必要があります。
import { createRecipe, validateRecipe, inspectImage, processBatch, packageResults }
from '/sdk/watermark.js';
// Run on this site's origin in a modern browser, after explicit file selection.
const files = [...document.querySelector('input[type="file"]').files];
const recipe = createRecipe('filename'); // watermark | filename | date | frame
const errors = validateRecipe(recipe);
if (errors.length) throw new Error(errors.join('; '));
const records = [];
try {
for (const file of files) records.push(await inspectImage(file));
const result = await processBatch(records, recipe);
if (result.failures.length || result.cancelled) {
console.warn('Check partial results before downloading', result);
}
if (result.entries.length) {
const zip = await packageResults(result.entries);
const url = URL.createObjectURL(zip);
const link = document.createElement('a');
link.href = url; link.download = 'labeled-photos.zip'; link.click();
setTimeout(() => URL.revokeObjectURL(url), 30000);
}
} finally {
records.forEach(record => URL.revokeObjectURL(record.thumbnail));
}| 機能 | 入力→結果 |
|---|---|
| createRecipe(mode) | watermark | filename | date | frame → 独立したv1レシピ。 |
| validateRecipe(recipe) | レシピ → string[] エラー;空は構成が有効であることを意味します。セマンティック検証では、一意の ID とトリミング境界もチェックされます。 |
| inspectImage(file) | File → Promise<Record> (ID、名前、ファイル、幅、高さ、サムネイル オブジェクト URL、オーバーライド、メタデータ、metadataWarning)。完了したらサムネイルを取り消します。{id,name,file,width,height,thumbnail,overrides,metadata,metadataWarning} |
| renderImage(record, recipe, options?) | → Promise<{blob, geometry}>; preview:true は {canvas, geometry} を返します。オプション: アセット:Map<assetId,ImageBitmap|Canvas>、インデックス:番号、maxDimension:番号、キャンバス:Canvas。 missingMetadataText?:string.{blob,geometry} | {canvas,geometry} |
| processBatch(records, recipe, options?) | → Promise<{entries,failures,cancelled}>。エントリ: {name,blob,width,height,sourceId};失敗: {id,name,longEdge,message}。オプション: アセット、シグナル:AbortSignal、onProgress({done,total,failed})、onResult(エントリ)。 missingMetadataText?:string.{entries:[{name,blob,width,height,sourceId}],failures:[{id,name,longEdge,message}],cancelled} |
| packageResults(entries) | → Promise<Blob> ZIP;結合された出力が 450 MiB を超えると拒否されます。 |
| decodeImage(blob) | → Promise<ImageBitmap>;終了したら close()。 HEIC は、最初にデコードされたイメージを使用します。 |
| parseLabelCsv(text) | filename,text CSV → Map<文字列,文字列>;正確な名前は一致しますが、重複した名前は拒否されます。加工前にrecord.labelをご自身で設定してください。 |
| imageRecipe(recipe, record) | 共有レシピを変更せずに、record.overrides.image と Record.overrides.layers[id] をマージします。 |
| renderStudioImage / cleanLogo | 低レベルの Canvas ヘルパー。署名については、リポジトリ package/watermark-core/src/studio.js を参照してください。エンコードされた出力には renderImage を優先します。 |
レシピのルールとエラー
/api/v1/recipes/watermark.json、filename.json、date.json、または Frame.json から完全なレシピをダウンロードします。最初に JSON Schema を検証し、次にセマンティック チェックのために validateRecipe を検証します。レイヤ ID は一意である必要があります。トリミング x + 幅と y + 高さは画像内に収まるようにする必要があります。サイズ、余白、境界線、フッターには、トリミングおよび回転された画像の短辺のパーセンテージが使用されます。出力 longEdge:0 はサイズを維持します。サイズ変更は決して拡大されません。 任意の image.crop.aspectRatio は回転後の内容の幅と高さの比率です。各画像の正規化された選択範囲内で中央を切り抜くため、サイズが異なる画像も同じ比率になります。枠とフッターは後から追加されます。切り抜きの割合を手動で変更すると比率指定は解除されます。
テキスト変数: {filename} は拡張子を除きます。 {fullname} にはそれが含まれています。 {index} は sequence.start とパディングを使用します。 {label}はrecord.labelを使用します。カメラ変数は、{camera}、{lens}、{aperture}、{iso}、{shutter}、{focal}です。 CSV は、SDK レコードに自動的に入力しません。
日付プリセットには、各画像の DateTimeOriginal または CreateDate が使用されます。ファイル変更日は置き換えられません。日付が欠落している場合、デフォルトでは空の日付ラベルが設定されます。 missing:error はそのイメージに失敗し、missing:custom は解析可能な場合は date.custom を使用します。 source:custom は、指定された日付を直接使用します。カスタム日付は認定されたタイムスタンプではありません。このポリシーに従って、無効な日付では空のラベルまたはエラーが発生する可能性があります。
レシピには設定が含まれますが、ロゴ バイトやカスタム フォントは含まれません。 layer.assetId をキーとする options.assets を通じてロゴを提供し、使用後にデコードされたロゴ ビットマップを閉じます。カスタム フォントは、LocalFont ファミリの下の document.fonts にロードする必要があります。不足しているリソースは明示的に失敗します。
SDK は、バッチ実行前に無効なレシピをスローします。イメージごとのデコード、レンダリング、メタデータ、またはエンコード エラーが failures に表示されますが、成功した entries は引き続き利用可能です。現在、エラーには人間が読める中国語のメッセージが含まれています。消費者はテキストを分岐させるべきではありません。キャンセルは出力間でチェックされます。現在のレンダリングは中断されません。 onResult の場合、entries はコールバックに渡され、返される entries 配列には保持されません。
制限とプライバシー
有料の写真カウント割り当て、アカウント、API キー、サブスクリプション、サイト ブランドの追加はありません。各入力は 150 MiB および 1 億 2,000 万ピクセルに制限されます。 ZIP 出力は 450 MiB に制限されています。最大 30 レイヤー、6 つの追加出力サイズ、長辺は最大 32768。ブラウザ Canvas、メモリ、デコーダ、およびファイル システムの制限はこれよりも低い可能性があります。大きなバッチを分割します。
出力は JPEG、PNG、または WebP です。 JPEG と非可逆 WebP は再エンコードされます。デフォルトのメタデータ モードは「strip」です。 「safe」および「all」モードでは JPEG 出力が必要です。 「safe」モードでは GPS が除外されます。 「all」モードは位置メタデータを保持できます。 ICC プロファイル、HDR、署名は保持されません。元のファイルは決して変更されません。
プログラム リソースのみが、/studio/. でのオフライン使用のためにオプションでキャッシュされます。新しいパブリック ページを最初に読み込むには、ネットワーク接続が必要です。ユーザーの画像とファイル名は、パブリック API に送信されたり、プリセットに保存されたりすることはありません。プライベートテキストを含まないレシピのみを保存/共有します。
ローカル MCP
この機能は、インターネット エンドポイントではなく、リポジトリによって提供されます。前提条件: Node.js、pnpm がリポジトリにインストールされ、Google Chrome がインストールされている。明示的に許可されたディレクトリを使用して、リポジトリからサーバーを実行します。 Web 検索結果からプライベート ファイルシステム パスを推測しないでください。
node scripts/watermark-mcp.mjs --root /absolute/authorized/photo-folder| ツール | 入力と結果 |
|---|---|
| validate_recipe | {recipe} → {errors:string[]}。画像を読み込まない。 |
| inspect_images | {files:string[]} → {images:[{id,name,width,height,metadata,metadataWarning}],failures:[{id,name,index,stage,message}]}. |
| preview_watermark | {files,recipe,output?,logos?} → {files:[{path,width,height}],failures,cancelled}。最初のイメージ (最長エッジ ≤1400) のみを書き込みます。 |
| batch_watermark | {files,recipe,output?,logos?} → {files:[{path,width,height}],failures,cancelled}。 ZIP ではなく、個々のイメージを書き込みます。 |
files の入力パスは --root 内で解決されます。 「logos」マップは、アセット ID を同じルート内のパスにリンクします。デフォルトのoutputはルート内のwatermark-outputです。絶対パスもこのルート内に存在する必要があります。シンボリックリンクのエスケープは拒否されます。新しい出力ファイル名を選択すると、既存のファイルが保存されます。 プレビューとバッチの入力スキーマでは recipe が必須です。inspect_images は files のみを受け付けます。無効な画像は failures に記録され、有効な画像の処理は続行されます。index は元の files 配列の0始まりの位置、stage は inspect または render です。プレビューは files[0] のみを処理し、別の画像に置き換えません。 無効なリクエストは、テキスト メッセージとともに「isError」を返します。個々の処理エラーは「failures」に残ります。呼び出しはリクエスト/レスポンスであり、中止ツールはありません。
MCP は、structuredContent ではなく、content[0].text 内でシリアル化された JSON を返します。検査と検証は読み取り専用です。コピーのプレビューとバッチ書き込み。写真をアップロードするツールはありません。クライアントは、ツールを使用する前に、このローカル stdio コマンドを明示的に構成する必要があります。