फोटो वॉटरमार्कमुफ़्त · आपकी तस्वीरें आपके डिवाइस पर रहती हैं

डेवलपर्स और सहायकों के लिए स्थानीय फोटो उपकरण

मुफ़्त बैच वॉटरमार्क, फ़ाइल नाम लेबल और दिनांक टिकटें। क्षमताओं की खोज करें, फिर डिवाइस पर स्पष्ट रूप से चयनित फ़ोटो को संसाधित करें।

मार्कडाउन के रूप में पढ़ें · OpenAPI 3.1 · पकाने की विधि स्कीमा

एक निष्पादन सतह चुनें

खोज API सार्वजनिक, मुफ़्त, केवल पढ़ने के लिए है और इसके लिए किसी API कुंजी की आवश्यकता नहीं है। यह टूल और सेटिंग्स का वर्णन करता है; यह कभी भी छवियाँ स्वीकार नहीं करता. कोई POST/वॉटरमार्क, क्लाउड प्रोसेसिंग सेवा या होस्ट किया गया MCP एंडपॉइंट नहीं है।

इस मूल पर स्पष्ट रूप से चयनित फ़ाइलों के लिए ब्राउज़र SDK का उपयोग करें। स्थानीय फ़ाइल सिस्टम एक्सेस वाले सहायक के लिए, रिपॉजिटरी के stdio MCP सर्वर को स्पष्ट रूप से कनेक्ट करें और रूट निर्देशिका को अधिकृत करें। इस दस्तावेज़ को ढूंढने वाला मॉडल किसी डिवाइस या उसकी फ़ाइलों तक पहुंच प्राप्त नहीं करता है।

सतहप्रयोजन
JSON/मार्कडाउन प्राप्त करेंक्षमताओं, व्यंजनों, बाधाओं और स्थानीय उपकरण हस्ताक्षरों की खोज करें।
ब्राउज़र ESM SDKफ़ाइलों को स्थानीय रूप से डिकोड और रेंडर करें; Canvas, DOM, createImageBitmap, और File/Blob की आवश्यकता है। Node या रिमोट HTTP प्रोसेसिंग API नहीं।
स्थानीय सीएलआई / stdio MCPस्थापित Google Chrome और रिपॉजिटरी निर्भरता का उपयोग करके स्पष्ट रूप से जुड़ा हुआ स्थानीय स्वचालन।

सार्वजनिक संसाधन

GET और HEAD स्थिर संसाधन लौटाते हैं। कोई प्रमाणीकरण, अनुरोध निकाय, क्वेरी पैरामीटर या उपयोगकर्ता डेटा नहीं। अज्ञात संसाधन पथ 404 लौटाते हैं। संस्करण 1 को अनुबंध संस्करण मानें; हैश किए गए निर्माण खंडों के बजाय विहित पथों को बुकमार्क करें। क्रॉस-ओरिजिनल ब्राउज़र एक्सेस का वादा नहीं किया गया है; समान-मूल SDK आयात का उपयोग करें।

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)पकाने की विधि → स्ट्रिंग[] त्रुटियाँ; खाली का अर्थ है कॉन्फ़िगरेशन वैध है। सिमेंटिक सत्यापन अद्वितीय आईडी और फसल सीमा की भी जांच करता है।
inspectImage(file)File → Promise<Record> आईडी, नाम, फ़ाइल, चौड़ाई, ऊंचाई, थंबनेल ऑब्जेक्ट यूआरएल, ओवरराइड, मेटाडेटा, मेटाडेटा चेतावनी के साथ। समाप्त होने पर थंबनेल निरस्त करें.{id,name,file,width,height,thumbnail,overrides,metadata,metadataWarning}
renderImage(record, recipe, options?)→ Promise<{blob, geometry}>; preview:true, {canvas, geometry} लौटाता है। विकल्प: संपत्ति: Map<assetId,ImageBitmap|Canvas>, सूचकांक: संख्या, अधिकतम आयाम: संख्या, कैनवास: 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>; समाप्त होने पर बंद करें()। HEIC पहली डिकोड की गई छवि का उपयोग करता है।
parseLabelCsv(text)filename,text CSV → Map<स्ट्रिंग,स्ट्रिंग>; सटीक-नाम मेल खाता है, डुप्लिकेट नाम अस्वीकार करते हैं। प्रसंस्करण से पहले स्वयं record.label सेट करें।
imageRecipe(recipe, record)साझा रेसिपी को बदले बिना record.overrides.image और रिकॉर्ड.ओवरराइड्स.लेयर्स[आईडी] को मर्ज करता है।
renderStudioImage / cleanLogoनिम्न-स्तरीय Canvas सहायक; हस्ताक्षरों के लिए रिपॉजिटरी पैकेज/वॉटरमार्क-कोर/src/studio.js देखें। एन्कोडेड आउटपुट के लिए renderImage को प्राथमिकता दें।

नुस्खा नियम और त्रुटियाँ

/api/v1/recipes/watermark.json, filename.json, date.json, याframe.json से पूरी रेसिपी डाउनलोड करें। सिमेंटिक जांच के लिए पहले JSON Schema को मान्य करें, फिर validateRecipe को मान्य करें। परत आईडी अद्वितीय होनी चाहिए. क्रॉप 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 एमआईबी और 120 मिलियन पिक्सेल तक सीमित है; 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 स्थापित करें। एक स्पष्ट अनुमत निर्देशिका के साथ, रिपॉजिटरी से सर्वर चलाएँ। वेब खोज परिणामों से किसी निजी फ़ाइल सिस्टम पथ का अनुमान न लगाएं।

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 मानचित्र संपत्ति आईडी को उसी रूट के भीतर पथों से जोड़ता है। रूट के अंदर डिफ़ॉल्ट output watermark-output है; निरपेक्ष पथ भी इस रूट के अंदर रहने चाहिए। प्रतीकात्मक-लिंक एस्केप खारिज कर दिए जाते हैं। मौजूदा फ़ाइलें नए आउटपुट फ़ाइल नाम चुनकर संरक्षित की जाती हैं। पूर्वावलोकन और बैच स्कीमा में recipe आवश्यक है; inspect_images केवल files स्वीकार करता है। खराब छवियाँ failures में आती हैं और सही छवियाँ जारी रहती हैं। index मूल files सरणी में 0 से शुरू होता है; stage inspect या render है। पूर्वावलोकन केवल files[0] को संसाधित करता है, दूसरी फ़ाइल नहीं चुनता। अमान्य अनुरोध एक पाठ संदेश के साथ isError लौटाते हैं; failures में व्यक्तिगत प्रसंस्करण त्रुटियाँ बनी रहती हैं। कॉल अनुरोध/प्रतिक्रिया हैं और कोई निरस्त करने वाला उपकरण नहीं है।

MCP JSON को content[0].text के अंदर क्रमबद्ध करता है, structuredContent नहीं। निरीक्षण और सत्यापन केवल पढ़ने योग्य हैं; पूर्वावलोकन और बैच लेखन प्रतियां। कोई भी टूल फ़ोटो अपलोड नहीं करता. टूल का उपयोग करने से पहले क्लाइंट को इस स्थानीय stdio कमांड को स्पष्ट रूप से कॉन्फ़िगर करना होगा।