Strumenti fotografici locali per sviluppatori e assistenti
Filigrane batch gratuite, etichette per nomi di file e datari. Scopri le funzionalità, quindi elabora le foto esplicitamente selezionate sul dispositivo.
Leggi come Markdown · OpenAPI 3.1 · Schema della ricetta
Scegli una superficie di esecuzione
Il rilevamento API è pubblico, gratuito, di sola lettura e non richiede la chiave API. Descrive strumenti e impostazioni; non accetta mai immagini. Non sono presenti POST/filigrana, servizi di elaborazione cloud o endpoint MCP ospitato.
Utilizzare il browser SDK per i file selezionati esplicitamente su questa origine. Per un assistente con accesso al filesystem locale, collega esplicitamente il server stdio MCP del repository e autorizza una directory root. Un modello che trova questa documentazione non ottiene l'accesso a un dispositivo o ai suoi file.
| Superficie | Scopo |
|---|---|
| OTTIENI JSON / Ribasso | Scopri funzionalità, ricette, vincoli e firme degli strumenti locali. |
| Browser ESM SDK | Decodificare ed eseguire il rendering dei file localmente; richiede Canvas, DOM, createImageBitmap e File/Blob. Non un Node o un'elaborazione HTTP remota API. |
| CLI locale/stdio MCP | Automazione locale connessa esplicitamente utilizzando Google Chrome installato e le dipendenze del repository. |
Risorse pubbliche
GET e HEAD restituiscono risorse statiche. Nessuna autenticazione, corpo della richiesta, parametri di query o dati utente. I percorsi delle risorse sconosciuti restituiscono 404. Considera la versione 1 come la versione del contratto; aggiungere ai segnalibri percorsi canonici anziché blocchi di compilazione con hash. L'accesso al browser multiorigine non è promesso; utilizzare importazioni SDK della stessa origine.
- Catalogo delle capacità
- Ricette predefinite complete e variabili di testo supportate
- Ricetta JSON Schema (2020-12)
- Schemi di ingresso locali MCP
- Specifica di rilevamento OpenAPI 3.1
- Directory di rilevamento facoltativa
curl https://watermark.noxxxx.com/api/v1/capabilities.json
curl https://watermark.noxxxx.com/api/v1/recipes/filename.jsonBrowser SDK
Importa /sdk/watermark.js sull'origine di questo sito. Questo è un URL di ingresso ESM stabile; i pezzi di implementazione possono cambiare. L'esempio seguente prevede l'input di più file e viene eseguito dopo che l'utente ha selezionato i file locali. Crea un ZIP di copie riuscite; i chiamanti devono controllare failures e cancelled invece di considerare l'esportazione parziale come completa.
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));
}| Funzione | Ingresso → risultato |
|---|---|
| createRecipe(mode) | watermark | filename | date | frame → ricetta v1 indipendente. |
| validateRecipe(recipe) | Errori ricetta → stringa[]; vuoto significa che la configurazione è valida. La convalida semantica controlla anche gli ID univoci e i limiti del ritaglio. |
| inspectImage(file) | File → Promise<Record> con ID, nome, file, larghezza, altezza, URL oggetto miniatura, sostituzioni, metadati, metadatiAvviso. Revoca la miniatura al termine.{id,name,file,width,height,thumbnail,overrides,metadata,metadataWarning} |
| renderImage(record, recipe, options?) | → Promise<{blob, geometry}>; preview:true restituisce {canvas, geometry}. opzioni: risorse:Map<assetId,ImageBitmap|Canvas>, indice:numero, maxDimension:numero, tela:Canvas. missingMetadataText?:string.{blob,geometry} | {canvas,geometry} |
| processBatch(records, recipe, options?) | → Promise<{entries,failures,cancelled}>. Voce: {name,blob,width,height,sourceId}; guasto: {id,name,longEdge,message}. opzioni: risorse, segnale:AbortSignal, onProgress({done,total,failed}), onResult(entrata). missingMetadataText?:string.{entries:[{name,blob,width,height,sourceId}],failures:[{id,name,longEdge,message}],cancelled} |
| packageResults(entries) | → Promise<Blob> ZIP; rifiuta quando l'output combinato supera i 450 MiB. |
| decodeImage(blob) | → Promise<ImageBitmap>; close() al termine. HEIC utilizza la prima immagine decodificata. |
| parseLabelCsv(text) | filename,text CSV → Map<stringa,stringa>; corrispondenze esatte del nome, nomi duplicati rifiutati. Imposta tu stesso record.label prima dell'elaborazione. |
| imageRecipe(recipe, record) | Unisce record.overrides.image e record.overrides.layers[id] senza modificare la ricetta condivisa. |
| renderStudioImage / cleanLogo | Aiutanti Canvas di basso livello; vedere repository packages/watermark-core/src/studio.js per le firme. Preferire renderImage per l'output codificato. |
Regole ed errori della ricetta
Scarica ricette complete da /api/v1/recipes/watermark.json, filename.json, date.json o frame.json. Convalidare prima JSON Schema, quindi validateRecipe per i controlli semantici. Gli ID livello devono essere univoci. Ritaglia x + larghezza e y + altezza devono rimanere all'interno dell'immagine. Dimensioni, margini, bordi e piè di pagina utilizzano percentuali del bordo corto dell'immagine ritagliata e ruotata. L'uscita longEdge:0 mantiene la dimensione; il ridimensionamento non migliora mai. Il campo facoltativo image.crop.aspectRatio definisce larghezza/altezza del contenuto dopo la rotazione. Il ritaglio è centrato nella selezione normalizzata di ogni immagine, anche con dimensioni diverse. Bordi e piè di pagina seguono dopo. Modificare le percentuali elimina il vincolo di proporzione.
Variabili di testo: {filename} esclude l'estensione; {fullname} lo include; {index} utilizza sequence.start e imbottitura; {label} utilizza record.label. Le variabili della fotocamera sono {camera}, {lens}, {aperture}, {iso}, {shutter}, {focal}. Un CSV non popola automaticamente i record SDK.
La data preimpostata utilizza DateTimeOriginal o CreateDate di ciascuna immagine. Nessuna data di modifica del file viene sostituita. Per impostazione predefinita, la data mancante è un'etichetta di data vuota; missing:error non supera l'immagine, missing:custom utilizza date.custom se analizzabile. source:custom utilizza direttamente la data fornita. Le date personalizzate non sono timestamp certificati. Secondo questa politica, le date non valide possono produrre un'etichetta vuota o un errore.
Una ricetta contiene impostazioni, non byte di logo o caratteri personalizzati. Fornisci loghi tramite options.assets codificato da layer.assetId e chiudi le bitmap dei loghi decodificati dopo l'uso. I caratteri personalizzati devono essere caricati in document.fonts nella famiglia LocalFont. Le risorse mancanti falliscono esplicitamente.
SDK genera ricette non valide prima dell'esecuzione batch. Errori di decodifica, rendering, metadati o codifica per immagine vengono visualizzati in failures, mentre entries con successo rimane disponibile. Gli errori attualmente contengono messaggi cinesi leggibili dall'uomo; i consumatori non dovrebbero diramarsi nel loro testo. La cancellazione viene controllata tra le uscite; il rendering corrente non viene interrotto. Con onResult, entries vengono consegnati al callback e non vengono conservati nell'array entries restituito.
Limiti e privacy
Nessuna quota di conteggio delle foto, account, chiave API, abbonamento o branding del sito aggiunto a pagamento. Ogni input è limitato a 150 MiB e 120 milioni di pixel; L'output di ZIP è limitato a 450 MiB. Massimo 30 livelli, 6 dimensioni di output aggiuntive, lato lungo fino a 32768. I limiti del browser Canvas, della memoria, del decoder e del file system possono essere inferiori; dividere grandi lotti.
Gli output sono JPEG, PNG o WebP. JPEG e WebP con perdita vengono ricodificati. La modalità di metadati predefinita è "strip". Le modalità "safe" e "all" richiedono l'output JPEG. La modalità "safe" esclude il GPS; la modalità "all" può conservare i metadati della posizione. I profili ICC, l'HDR e le firme non vengono conservati. I file originali non vengono mai modificati.
Solo le risorse del programma vengono facoltativamente memorizzate nella cache per l'utilizzo offline in /studio/.. Le nuove pagine pubbliche richiedono inizialmente una connessione di rete per essere caricate. Le immagini e i nomi dei file dell'utente non vengono inviati al pubblico API né memorizzati nelle preimpostazioni. Salva/condividi solo le ricette che non contengono testo privato.
Locale MCP
Questa funzionalità è fornita dal repository, non da un endpoint Internet. Prerequisiti: installazione di Node.js, pnpm nel repository e installazione di Google Chrome. Esegui il server dal repository, con una directory consentita esplicita. Non dedurre un percorso del file system privato dai risultati della ricerca Web.
node scripts/watermark-mcp.mjs --root /absolute/authorized/photo-folder| Strumento | Ingresso e risultato |
|---|---|
| validate_recipe | {recipe} → {errors:string[]}. Non legge le immagini. |
| 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}. Scrive solo la prima immagine, bordo più lungo ≤1400. |
| batch_watermark | {files,recipe,output?,logos?} → {files:[{path,width,height}],failures,cancelled}. Scrive singole immagini, non un ZIP. |
I percorsi di input in "files" vengono risolti all'interno di "--root". La mappa "logos" collega gli ID delle risorse ai percorsi all'interno della stessa radice. Il valore predefinito output è watermark-output all'interno della radice; anche i percorsi assoluti devono rimanere all'interno di questa radice. Gli escape dei collegamenti simbolici vengono rifiutati. I file esistenti vengono conservati scegliendo nuovi nomi di file di output. Gli schemi di anteprima e batch richiedono recipe; inspect_images accetta solo files. Le immagini non valide compaiono in failures e le altre proseguono. index parte da 0 nell’array files originale; stage è inspect o render. L’anteprima elabora solo files[0], senza sostituirlo. Le richieste non valide restituiscono isError con un messaggio di testo; gli errori di elaborazione individuali rimangono in "failures". Le chiamate sono di richiesta/risposta e non è presente alcuno strumento di interruzione.
MCP restituisce JSON serializzato all'interno di content[0].text, non structuredContent. Ispeziona e convalida sono di sola lettura; visualizzare in anteprima e scrivere copie in batch. Nessuno strumento carica le foto. Un client deve configurare esplicitamente questo comando stdio locale prima di utilizzare gli strumenti.