Tanda Air FotoGratis · Foto Anda tetap ada di perangkat Anda

Alat foto lokal untuk pengembang dan asisten

Tanda air batch gratis, label nama file, dan stempel tanggal. Temukan kemampuannya, lalu proses foto yang dipilih secara eksplisit di perangkat.

Baca sebagai Penurunan Harga · OpenAPI 3.1 · Skema resep

Pilih permukaan eksekusi

Penemuan API bersifat publik, gratis, hanya-baca, dan tidak memerlukan kunci API. Ini menjelaskan alat dan pengaturan; ia tidak pernah menerima gambar. Tidak ada POST/tanda air, layanan pemrosesan cloud, atau titik akhir MCP yang dihosting.

Gunakan browser SDK untuk File yang dipilih secara eksplisit pada asal ini. Untuk asisten dengan akses sistem file lokal, sambungkan server stdio MCP repositori secara eksplisit dan otorisasi direktori root. Model yang menemukan dokumentasi ini tidak mendapatkan akses ke perangkat atau filenya.

PermukaanTujuan
DAPATKAN JSON / Penurunan hargaTemukan kemampuan, resep, batasan, dan ciri khas alat lokal.
Peramban ESM SDKDekode dan render file secara lokal; membutuhkan Canvas, DOM, createImageBitmap, dan File/Blob. Bukan Node atau pemrosesan HTTP jarak jauh API.
CLI/stdio lokal MCPOtomatisasi lokal yang terhubung secara eksplisit menggunakan Google Chrome yang terinstal dan dependensi repositori.

Sumber daya publik

GET dan HEAD mengembalikan sumber daya statis. Tidak ada autentikasi, isi permintaan, parameter kueri, atau data pengguna. Jalur sumber daya tidak diketahui mengembalikan 404. Perlakukan versi 1 sebagai versi kontrak; tandai jalur kanonik daripada potongan build yang di-hash. Akses browser lintas asal tidak dijanjikan; gunakan impor SDK asal yang sama.

curl https://watermark.noxxxx.com/api/v1/capabilities.json
curl https://watermark.noxxxx.com/api/v1/recipes/filename.json

Peramban SDK

Impor /sdk/watermark.js di situs asal ini. Ini adalah URL entri ESM yang stabil; potongan implementasi dapat berubah. Contoh berikut mengharapkan input beberapa file dan dijalankan setelah pengguna memilih file lokal. Ini menciptakan ZIP salinan yang berhasil; penelepon harus memeriksa failures dan cancelled daripada menganggap ekspor sebagian sudah selesai.

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));
}
FungsiMasukan → hasil
createRecipe(mode)watermark | filename | date | frame → resep v1 independen.
validateRecipe(recipe)Resep → kesalahan string[]; kosong berarti konfigurasi valid. Validasi semantik juga memeriksa ID unik dan batas pangkas.
inspectImage(file)File → Promise<Record> dengan id, nama, file, lebar, tinggi, URL objek thumbnail, override, metadata, metadataWarning. Cabut thumbnail setelah selesai.{id,name,file,width,height,thumbnail,overrides,metadata,metadataWarning}
renderImage(record, recipe, options?)→ Promise<{blob, geometry}>; preview:true mengembalikan {canvas, geometry}. opsi: aset:Map<assetId,ImageBitmap|Canvas>, indeks:angka, maxDimension:angka, kanvas:Canvas. missingMetadataText?:string.{blob,geometry} | {canvas,geometry}
processBatch(records, recipe, options?)→ Promise<{entries,failures,cancelled}>. Entri: {name,blob,width,height,sourceId}; kegagalan: {id,name,longEdge,message}. pilihan: aset, sinyal: AbortSignal, onProgress({done,total,failed}), onResult(entri). missingMetadataText?:string.{entries:[{name,blob,width,height,sourceId}],failures:[{id,name,longEdge,message}],cancelled}
packageResults(entries)→ Promise<Blob> ZIP; ditolak ketika output gabungan melebihi 450 MiB.
decodeImage(blob)→ Promise<ImageBitmap>; tutup() setelah selesai. HEIC menggunakan gambar yang didekodekan pertama.
parseLabelCsv(text)filename,text CSV → Map<string,string>; nama persisnya cocok, nama duplikat ditolak. Atur sendiri record.label sebelum diproses.
imageRecipe(recipe, record)Menggabungkan record.overrides.image dan record.overrides.layers[id] tanpa mengubah resep yang dibagikan.
renderStudioImage / cleanLogoPembantu Canvas tingkat rendah; lihat paket repositori/watermark-core/src/studio.js untuk tanda tangan. Lebih suka renderImage untuk keluaran yang dikodekan.

Aturan dan kesalahan resep

Unduh resep lengkap dari /api/v1/recipes/watermark.json, nama file.json, date.json, atau frame.json. Validasi JSON Schema terlebih dahulu, lalu validateRecipe untuk pemeriksaan semantik. ID lapisan harus unik. Pangkas x + lebar dan y + tinggi harus tetap berada di dalam gambar. Ukuran, margin, batas, dan footer menggunakan persentase tepi pendek gambar yang dipotong dan diputar. Output longEdge:0 menjaga ukuran; mengubah ukuran tidak pernah meningkatkan. image.crop.aspectRatio opsional menentukan lebar/tinggi konten setelah rotasi. Setiap gambar dipotong di tengah pilihan ternormalisasinya, termasuk gambar dengan ukuran berbeda. Bingkai dan footer ditambahkan kemudian. Mengubah persentase secara manual menghapus aturan rasio.

Variabel teks: {filename} tidak termasuk ekstensi; {fullname} menyertakannya; {index} menggunakan sequence.start dan bantalan; {label} menggunakan record.label. Variabel kamera adalah {camera}, {lens}, {aperture}, {iso}, {shutter}, {focal}. CSV tidak secara otomatis mengisi data SDK.

Prasetel tanggal menggunakan DateTimeOriginal atau CreateDate setiap gambar. Tidak ada tanggal modifikasi file yang diganti. Tanggal yang hilang defaultnya adalah label tanggal yang kosong; missing:error gagal dalam gambar itu, missing:custom menggunakan date.custom jika dapat diurai. source:custom menggunakan tanggal yang disediakan secara langsung. Tanggal khusus bukanlah stempel waktu yang disertifikasi. Tanggal yang tidak valid dapat menghasilkan label kosong atau kesalahan sesuai dengan kebijakan ini.

Resep berisi pengaturan, bukan byte logo atau font khusus. Pasokan logo melalui options.assets yang dikunci oleh layer.assetId, dan tutup bitmap logo yang didekodekan setelah digunakan. Font khusus harus dimuat ke document.fonts di bawah keluarga LocalFont. Sumber daya yang hilang gagal secara eksplisit.

SDK menampilkan resep yang tidak valid sebelum eksekusi batch. Kesalahan dekode, render, metadata, atau enkode per gambar muncul di failures, sedangkan entries yang berhasil tetap tersedia. Kesalahan saat ini berisi pesan berbahasa Mandarin yang dapat dibaca manusia; konsumen tidak boleh bercabang pada teks mereka. Pembatalan diperiksa antar keluaran; render saat ini tidak terganggu. Dengan onResult, entries dikirimkan ke panggilan balik dan tidak disimpan dalam larik entries yang dikembalikan.

Batasan dan privasi

Tidak ada kuota penghitungan foto berbayar, akun, kunci API, langganan, atau penambahan branding situs. Setiap masukan dibatasi hingga 150 MiB dan 120 juta piksel; Keluaran ZIP dibatasi hingga 450 MiB. Maksimum 30 lapisan, 6 ukuran keluaran tambahan, tepi panjang hingga 32768. Batas browser Canvas, memori, dekoder, dan sistem file bisa lebih rendah; membagi batch besar.

Outputnya adalah JPEG, PNG, atau WebP. JPEG dan WebP lossy dikodekan ulang. Mode metadata defaultnya adalah strip. Mode safe dan all memerlukan keluaran JPEG. Mode safe tidak termasuk GPS; mode all dapat menyimpan metadata lokasi. Profil ICC, HDR, dan tanda tangan tidak disimpan. File asli tidak pernah diubah.

Hanya sumber daya program yang secara opsional di-cache untuk penggunaan offline di /studio/.. Halaman publik baru memerlukan koneksi jaringan untuk memuat pada awalnya. Gambar pengguna dan nama file tidak dikirim ke API publik atau disimpan dalam preset. Simpan/bagikan hanya resep yang tidak mengandung teks pribadi.

MCP lokal

Kemampuan ini disediakan oleh repositori, bukan titik akhir internet. Prasyarat: Node.js, pnpm instal di repositori, dan instal Google Chrome. Jalankan server dari repositori, dengan direktori yang diizinkan secara eksplisit. Jangan menyimpulkan jalur sistem file pribadi dari hasil pencarian web.

node scripts/watermark-mcp.mjs --root /absolute/authorized/photo-folder
AlatMasukan dan hasil
validate_recipe{recipe} → {errors:string[]}. Tidak membaca gambar.
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}. Hanya menulis gambar pertama, tepi terpanjang ≤1400.
batch_watermark{files,recipe,output?,logos?} → {files:[{path,width,height}],failures,cancelled}. Menulis gambar individual, bukan ZIP.

Jalur masukan di files diselesaikan di dalam --root. Peta logos menghubungkan ID aset ke jalur dalam root yang sama. Default output adalah watermark-output di dalam root; jalur absolut juga harus tetap berada di dalam root ini. Pelarian tautan simbolis ditolak. File yang ada dipertahankan dengan memilih nama file keluaran baru. Skema pratinjau dan batch mewajibkan recipe; inspect_images hanya menerima files. Gambar tidak valid masuk failures, gambar valid tetap diproses. index dimulai dari 0 pada array files asli; stage adalah inspect atau render. Pratinjau hanya memproses files[0], tanpa penggantian. Permintaan yang tidak valid menampilkan isError dengan pesan teks; kesalahan pemrosesan individual tetap ada di failures. Panggilan adalah permintaan/tanggapan dan tidak ada alat pembatalan.

MCP mengembalikan JSON yang diserialkan di dalam content[0].text, bukan structuredContent. Pemeriksaan dan validasi bersifat hanya baca; pratinjau dan salinan tulis batch. Tidak ada alat yang mengunggah foto. Klien harus secara eksplisit mengkonfigurasi perintah stdio lokal ini sebelum menggunakan alat tersebut.