Fotoğraf FiligranıÜcretsiz · Fotoğraflarınız cihazınızda kalır

Geliştiriciler ve asistanlar için yerel fotoğraf araçları

Ücretsiz toplu filigranlar, dosya adı etiketleri ve tarih damgaları. Yetenekleri keşfedin, ardından açıkça seçilen fotoğrafları cihazda işleyin.

Markdown olarak oku · OpenAPI 3.1 · Tarif şeması

Bir yürütme yüzeyi seçin

Discovery API herkese açık, ücretsiz, salt okunurdur ve API anahtarı gerektirmez. Araçları ve ayarları açıklar; asla görselleri kabul etmez. POST/filigran, bulut işleme hizmeti veya barındırılan MCP uç noktası yoktur.

Bu kaynaktaki açıkça seçilen Dosyalar için SDK tarayıcısını kullanın. Yerel dosya sistemi erişimine sahip bir asistan için, deponun stdio MCP sunucusunu açıkça bağlayın ve bir kök dizini yetkilendirin. Bu belgeleri bulan model, bir aygıta veya aygıtın dosyalarına erişim sağlamaz.

YüzeyAmaç
JSON / İndirimi ALINYetenekleri, tarifleri, kısıtlamaları ve yerel araç imzalarını keşfedin.
Tarayıcı ESM SDKDosyaların kodunu yerel olarak çözün ve işleyin; Canvas, DOM, createImageBitmap ve File/Blob gerektirir. Node veya uzaktan HTTP işleyen API değil.
Yerel CLI / stdio MCPKurulu Google Chrome ve veri havuzu bağımlılıklarını kullanarak açıkça bağlı yerel otomasyon.

Kamu kaynakları

GET ve HEAD statik kaynakları döndürür. Kimlik doğrulama, istek gövdesi, sorgu parametreleri veya kullanıcı verileri yok. Bilinmeyen kaynak yolları 404 döndürüyor. Sürüm 1'i sözleşme sürümü olarak değerlendirin; karma yapı parçaları yerine kanonik yollara yer işareti koyun. Çapraz kaynak tarayıcı erişimi vaat edilmiyor; aynı kökenli SDK içe aktarmalarını kullanın.

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

Tarayıcı SDK

/sdk/watermark.js'yi bu sitenin kaynağına aktarın. Bu, kararlı bir ESM giriş URL'sidir; uygulama parçaları değişebilir. Aşağıdaki örnekte birden fazla dosya girişi bekleniyor ve kullanıcı yerel dosyaları seçtikten sonra çalışıyor. Başarılı kopyalardan oluşan bir ZIP oluşturur; arayanların kısmi dışa aktarımı tamamlanmış olarak değerlendirmek yerine failures ve cancelled'yi incelemesi gerekir.

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));
}
İşlevGiriş → sonuç
createRecipe(mode)watermark | filename | date | frame → bağımsız v1 tarifi.
validateRecipe(recipe)Tarif → string[] hataları; boş, yapılandırmanın geçerli olduğu anlamına gelir. Anlamsal doğrulama aynı zamanda benzersiz kimlikleri ve kırpma sınırlarını da kontrol eder.
inspectImage(file)File → Promise<Record> kimlik, ad, dosya, genişlik, yükseklik, küçük resim nesne URL'si, geçersiz kılmalar, meta veriler, metadataWarning ile. Bittiğinde küçük resmi iptal edin.{id,name,file,width,height,thumbnail,overrides,metadata,metadataWarning}
renderImage(record, recipe, options?)→ Promise<{blob, geometry}>; preview:true, {canvas, geometry}'yi döndürür. seçenekler: varlıklar:Map<assetId,ImageBitmap|Canvas>, indeks:sayı, maxDimension:sayı, canvas:Canvas. missingMetadataText?:string.{blob,geometry} | {canvas,geometry}
processBatch(records, recipe, options?)→ Promise<{entries,failures,cancelled}>. Giriş: {name,blob,width,height,sourceId}; arıza: {id,name,longEdge,message}. seçenekler: varlıklar, sinyal:AbortSignal, onProgress({done,total,failed}), onResult(giriş). missingMetadataText?:string.{entries:[{name,blob,width,height,sourceId}],failures:[{id,name,longEdge,message}],cancelled}
packageResults(entries)→ Promise<Blob> ZIP; birleşik çıktı 450 MiB'yi aştığında reddeder.
decodeImage(blob)→ Promise<ImageBitmap>; Bittiğinde close(). HEIC ilk kodu çözülmüş görüntüyü kullanır.
parseLabelCsv(text)filename,text CSV → Map<string,string>; tam ad eşleşir, yinelenen adlar reddedilir. İşlemeden önce record.label ayarını kendiniz yapın.
imageRecipe(recipe, record)Paylaşılan tarifi değiştirmeden record.overrides.image ve Record.overrides.layers[id]'yi birleştirir.
renderStudioImage / cleanLogoDüşük seviyeli Canvas yardımcıları; imzalar için depo paketlerine/watermark-core/src/studio.js'ye bakın. Kodlanmış çıktı için renderImage'yi tercih edin.

Tarif kuralları ve hataları

Tariflerin tamamını /api/v1/recipes/watermark.json, filename.json, date.json veyaframe.json adresinden indirin. Anlamsal kontroller için önce JSON Schema'yi, ardından validateRecipe'yi doğrulayın. Katman kimlikleri benzersiz olmalıdır. Kırpma x + genişlik ve y + yükseklik görüntünün içinde kalmalıdır. Boyutlar, kenar boşlukları, kenarlıklar ve alt bilgiler, kırpılan ve döndürülen görüntünün kısa kenarının yüzdelerini kullanır. Çıkış longEdge:0 boyutu korur; yeniden boyutlandırma hiçbir zaman yükseltme yapmaz. İsteğe bağlı image.crop.aspectRatio, döndürmeden sonraki içerik en/boy oranıdır. Farklı boyutlarda bile her görselin normalize edilmiş seçimi ortalanarak kırpılır. Kenarlık ve alt bilgi daha sonra eklenir. Yüzdeleri elle düzenlemek oran kuralını kaldırır.

Metin değişkenleri: {filename} uzantıyı hariç tutar; {fullname} bunu içerir; {index}, sequence.start ve dolguyu kullanır; {label}, record.label'yi kullanır. Kamera değişkenleri {camera}, {lens}, {aperture}, {iso}, {shutter}, {focal}'dir. CSV, SDK kayıtlarını otomatik olarak doldurmaz.

Tarih ön ayarı her görüntünün DateTimeOriginal veya CreateDate değerini kullanır. Hiçbir dosya değişiklik tarihi değiştirilmez. Eksik tarih varsayılan olarak boş bir tarih etiketine dönüşür; missing:error bu görüntüde başarısız olur, missing:custom ayrıştırılabilirse date.custom'yi kullanır. source:custom sağlanan tarihi doğrudan kullanır. Özel tarihler sertifikalı zaman damgaları değildir. Geçersiz tarihler, bu politikaya göre boş bir etikete veya hataya neden olabilir.

Bir tarif, logo baytlarını veya özel yazı tiplerini değil, ayarları içerir. layer.assetId tarafından anahtarlanan options.assets aracılığıyla logoları sağlayın ve kullanımdan sonra kodu çözülmüş logo bit eşlemlerini kapatın. Özel yazı tipleri, LocalFont ailesi altında document.fonts'ye yüklenmelidir. Eksik kaynaklar açıkça başarısız olur.

SDK, toplu yürütmeden önce geçersiz tarifler atar. failures'de görüntü başına kod çözme, oluşturma, meta veri veya kodlama hataları görünürken, başarılı entries kullanılabilir durumda kalır. Hatalar şu anda insanlar tarafından okunabilen Çince mesajlar içermektedir; tüketiciler metinlerine dalmamalıdır. Çıkışlar arasında iptal kontrolü yapılır; geçerli işleme kesintiye uğramaz. onResult ile entries geri aramaya iletilir ve döndürülen entries dizisinde tutulmaz.

Sınırlar ve gizlilik

Ücretli fotoğraf sayımı kotası, hesap, API anahtarı, abonelik veya site markalaması eklenmez. Her giriş 150 MiB ve 120 milyon pikselle sınırlıdır; ZIP çıkışı 450 MiB ile sınırlıdır. Maksimum 30 katman, 6 ek çıktı boyutu, 32768'e kadar uzun kenar. Tarayıcı Canvas, bellek, kod çözücü ve dosya sistemi sınırları daha düşük olabilir; büyük partileri bölün.

Çıktılar JPEG, PNG veya WebP'dir. JPEG ve kayıplı WebP yeniden kodlanır. Varsayılan meta veri modu 'strip'dir. 'safe' ve 'all' modları JPEG çıktısı gerektirir. 'safe' modu GPS'i hariç tutar; 'all' modu konum meta verilerini koruyabilir. ICC profilleri, HDR ve imzalar korunmaz. Orijinal dosyalar hiçbir zaman değiştirilmez.

/studio/.'de yalnızca program kaynakları isteğe bağlı olarak çevrimdışı kullanım için önbelleğe alınır. Yeni genel sayfaların başlangıçta yüklenmesi için bir ağ bağlantısı gerekir. Kullanıcı görüntüleri ve dosya adları genel API'ye gönderilmez veya ön ayarlarda saklanmaz. Yalnızca özel metin içermeyen tarifleri kaydedin/paylaşın.

Yerel MCP

Bu yetenek bir internet uç noktası tarafından değil, depo tarafından sağlanır. Önkoşullar: Node.js, pnpm'nin depoya kurulması ve Google Chrome'nin kurulması. Sunucuyu açık bir izin verilen dizinle depodan çalıştırın. Web arama sonuçlarından özel bir dosya sistemi yolu çıkarmayın.

node scripts/watermark-mcp.mjs --root /absolute/authorized/photo-folder
AraçGiriş ve sonuç
validate_recipe{recipe} → {errors:string[]}. Görüntüleri okumuyor.
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}. Yalnızca ilk görüntüyü yazar, en uzun kenar ≤1400.
batch_watermark{files,recipe,output?,logos?} → {files:[{path,width,height}],failures,cancelled}. ZIP değil, tek tek görüntüleri yazar.

'files' içindeki giriş yolları '--root' içinde çözümlenir. 'logos' haritası, öğe kimliklerini aynı kök içindeki yollara bağlar. Varsayılan 'output' kök içindeki 'watermark-output'tür; mutlak yollar da bu kökün içinde kalmalıdır. Sembolik bağlantı kaçışları reddedilir. Yeni çıktı dosya adları seçilerek mevcut dosyalar korunur. Önizleme ve toplu işlem şemaları recipe gerektirir; inspect_images yalnızca files kabul eder. Geçersiz görseller failures içinde bildirilir, geçerli olanlar devam eder. index özgün files dizisinde 0’dan başlar; stage inspect veya render olur. Önizleme yalnızca files[0] dosyasını işler, başka dosya kullanmaz. Geçersiz istekler kısa mesajla birlikte 'isError' değerini döndürür; bireysel işlem hataları 'failures'da kalıyor. Aramalar istek/yanıt şeklindedir ve iptal etme aracı yoktur.

MCP, structuredContent'yi değil, content[0].text içinde serileştirilmiş JSON'yi döndürür. İnceleme ve doğrulama salt okunurdur; önizleme ve toplu yazma kopyaları. Hiçbir araç fotoğraf yüklemez. Bir istemcinin araçları kullanmadan önce bu yerel stdio komutunu açıkça yapılandırması gerekir.