Lokale fototools voor ontwikkelaars en assistenten
Gratis batchwatermerken, bestandsnaamlabels en datumstempels. Ontdek de mogelijkheden en verwerk vervolgens expliciet geselecteerde foto's op het apparaat.
Lees als Markdown · OpenAPI 3.1 · Receptschema
Kies een uitvoeringsoppervlak
De ontdekking API is openbaar, gratis, alleen-lezen en vereist geen API-sleutel. Het beschrijft tools en instellingen; het accepteert nooit afbeeldingen. Er is geen POST/watermerk, cloudverwerkingsservice of gehost MCP-eindpunt.
Gebruik de browser SDK voor expliciet geselecteerde bestanden op deze oorsprong. Voor een assistent met toegang tot het lokale bestandssysteem sluit u expliciet de stdio MCP-server van de repository aan en autoriseert u een hoofdmap. Een model dat deze documentatie vindt, krijgt geen toegang tot een apparaat of de bestanden ervan.
| Oppervlak | Doel |
|---|---|
| KRIJG JSON / korting | Ontdek mogelijkheden, recepten, beperkingen en lokale toolsignaturen. |
| Browser ESM SDK | Decodeer en render bestanden lokaal; vereist Canvas, DOM, createImageBitmap en File/Blob. Geen Node of externe HTTP-verwerking API. |
| Lokale CLI/stdio MCP | Expliciet verbonden lokale automatisering met behulp van geïnstalleerde Google Chrome en repository-afhankelijkheden. |
Publieke middelen
GET en HEAD retourneren statische bronnen. Geen authenticatie, verzoektekst, queryparameters of gebruikersgegevens. Onbekende bronpaden retourneren 404. Behandel versie 1 als de contractversie; maak een bladwijzer voor canonieke paden in plaats van gehashte build-brokken. Er wordt geen cross-origin browsertoegang beloofd; gebruik SDK-importen van dezelfde oorsprong.
- Capaciteitscatalogus
- Voltooi standaardrecepten en ondersteunde tekstvariabelen
- Recept JSON Schema (2020-12)
- Lokale MCP-invoerschema's
- OpenAPI 3.1 detectiespecificatie
- Optionele detectiemap
curl https://watermark.noxxxx.com/api/v1/capabilities.json
curl https://watermark.noxxxx.com/api/v1/recipes/filename.jsonBrowser SDK
Importeer /sdk/watermark.js op de oorsprong van deze site. Dit is een stabiele ESM-invoer-URL; implementatiebrokken kunnen veranderen. Het volgende voorbeeld verwacht invoer van meerdere bestanden en wordt uitgevoerd nadat de gebruiker lokale bestanden heeft geselecteerd. Er wordt een ZIP van succesvolle kopieën gemaakt; bellers moeten failures en cancelled inspecteren in plaats van de gedeeltelijke export als voltooid te beschouwen.
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));
}| Functie | Invoer → resultaat |
|---|---|
| createRecipe(mode) | watermark | filename | date | frame → onafhankelijk v1-recept. |
| validateRecipe(recipe) | Recept → string[] fouten; leeg betekent dat de configuratie geldig is. Semantische validatie controleert ook unieke ID's en bijsnijdgrenzen. |
| inspectImage(file) | File → Promise<Record> met id, naam, bestand, breedte, hoogte, miniatuurobject-URL, overschrijvingen, metadata, metadataWaarschuwing. Miniatuur intrekken als u klaar bent.{id,name,file,width,height,thumbnail,overrides,metadata,metadataWarning} |
| renderImage(record, recipe, options?) | → Promise<{blob, geometry}>; preview:true retourneert {canvas, geometry}. opties: activa:Map<assetId,ImageBitmap|Canvas>, index:getal, maxAfmeting:getal, canvas:Canvas. missingMetadataText?:string.{blob,geometry} | {canvas,geometry} |
| processBatch(records, recipe, options?) | → Promise<{entries,failures,cancelled}>. Vermelding: {name,blob,width,height,sourceId}; fout: {id,name,longEdge,message}. opties: activa, signaal: AbortSignal, onProgress({done,total,failed}), onResult(entry). missingMetadataText?:string.{entries:[{name,blob,width,height,sourceId}],failures:[{id,name,longEdge,message}],cancelled} |
| packageResults(entries) | → Promise<Blob> ZIP; wordt afgewezen wanneer de gecombineerde uitvoer groter is dan 450 MiB. |
| decodeImage(blob) | → Promise<ImageBitmap>; close() als u klaar bent. HEIC gebruikt het eerste gedecodeerde beeld. |
| parseLabelCsv(text) | filename,text CSV → Map<tekenreeks,tekenreeks>; exacte naam komt overeen, dubbele namen worden afgewezen. Stel record.label zelf in voordat u gaat verwerken. |
| imageRecipe(recipe, record) | Voegt record.overrides.image en record.overrides.layers[id] samen zonder het gedeelde recept te muteren. |
| renderStudioImage / cleanLogo | Canvas-helpers op laag niveau; zie repositorypakketten/watermark-core/src/studio.js voor handtekeningen. Geef de voorkeur aan renderImage voor gecodeerde uitvoer. |
Receptregels en fouten
Download volledige recepten van /api/v1/recipes/watermark.json, bestandsnaam.json, date.json of frame.json. Valideer eerst JSON Schema en vervolgens validateRecipe voor semantische controles. Laag-ID's moeten uniek zijn. Bijsnijden x + breedte en y + hoogte moeten binnen de afbeelding blijven. Maten, marges, randen en voetteksten gebruiken percentages van de korte rand van de bijgesneden en geroteerde afbeelding. Uitvoer longEdge:0 behoudt grootte; Het formaat wijzigen wordt nooit opgeschaald. Het optionele image.crop.aspectRatio bepaalt breedte/hoogte na rotatie. Elke afbeelding wordt gecentreerd bijgesneden binnen de genormaliseerde selectie, ook bij verschillende afmetingen. Randen en voettekst volgen daarna. Handmatig percentages wijzigen wist de verhoudingsregel.
Tekstvariabelen: {filename} sluit extensie uit; {fullname} bevat het; {index} gebruikt sequence.start en opvulling; {label} gebruikt record.label. Cameravariabelen zijn {camera}, {lens}, {aperture}, {iso}, {shutter}, {focal}. Een CSV vult de SDK-records niet automatisch in.
De datumvoorinstelling gebruikt de DateTimeOriginal of CreateDate van elke afbeelding. Er wordt geen wijzigingsdatum van het bestand vervangen. Ontbrekende datum is standaard een leeg datumlabel; missing:error voldoet niet aan die afbeelding, missing:custom gebruikt date.custom indien parseerbaar. source:custom gebruikt direct de opgegeven datum. Aangepaste datums zijn geen gecertificeerde tijdstempels. Ongeldige datums kunnen volgens dit beleid een leeg label of een fout opleveren.
Een recept bevat instellingen, geen logobytes of aangepaste lettertypen. Lever logo's aan via options.assets, ingetoetst door layer.assetId, en sluit gedecodeerde logo-bitmaps na gebruik. Aangepaste lettertypen moeten in document.fonts worden geladen onder hun LocalFont-familie. Ontbrekende bronnen mislukken expliciet.
De SDK genereert ongeldige recepten voordat de batch wordt uitgevoerd. Decoderings-, render-, metadata- of coderingsfouten per afbeelding verschijnen in failures, terwijl succesvolle entries beschikbaar blijven. Fouten bevatten momenteel voor mensen leesbare Chinese berichten; consumenten mogen hun tekst niet vertakken. Annulering wordt gecontroleerd tussen uitgangen; de huidige weergave wordt niet onderbroken. Met onResult wordt entries afgeleverd bij de callback en niet vastgehouden in de geretourneerde entries-array.
Grenzen en privacy
Geen betaald quotum voor het tellen van foto's, account, API-sleutel, abonnement of toegevoegde sitebranding. Elke invoer is beperkt tot 150 MiB en 120 miljoen pixels; ZIP-uitvoer is beperkt tot 450 MiB. Maximaal 30 lagen, 6 extra uitvoerformaten, lange rand tot 32768. Browser Canvas, geheugen, decoder en bestandssysteemlimieten kunnen lager zijn; grote partijen splitsen.
Uitvoer is JPEG, PNG of WebP. JPEG en lossy WebP worden opnieuw gecodeerd. De standaard metadatamodus is strip. De modi 'safe' en 'all' vereisen JPEG-uitvoer. De modus safe is exclusief GPS; de 'all'-modus kan locatiemetagegevens behouden. ICC-profielen, HDR en handtekeningen blijven niet behouden. Originele bestanden worden nooit gewijzigd.
Alleen programmabronnen worden optioneel in de cache opgeslagen voor offline gebruik in /studio/.. De nieuwe openbare pagina's hebben een netwerkverbinding nodig om in eerste instantie te kunnen laden. Gebruikersafbeeldingen en bestandsnamen worden niet naar het publiek verzonden API of opgeslagen in presets. Bewaar/deel alleen recepten die geen privétekst bevatten.
Lokaal MCP
Deze mogelijkheid wordt geleverd door de repository, niet door een interneteindpunt. Vereisten: Node.js, pnpm installeren in de repository en Google Chrome installeren. Voer de server uit vanuit de repository, met een expliciet toegestane directory. Leid geen persoonlijk bestandssysteempad af uit de zoekresultaten op internet.
node scripts/watermark-mcp.mjs --root /absolute/authorized/photo-folder| Gereedschap | Invoer en resultaat |
|---|---|
| validate_recipe | {recipe} → {errors:string[]}. Leest geen afbeeldingen. |
| 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}. Schrijft alleen het eerste beeld, langste rand ≤1400. |
| batch_watermark | {files,recipe,output?,logos?} → {files:[{path,width,height}],failures,cancelled}. Schrijft individuele afbeeldingen, niet een ZIP. |
Invoerpaden in files worden omgezet in --root. De kaart 'logos' koppelt item-ID's aan paden binnen dezelfde root. De standaardwaarde 'output' is 'watermark-output' in de root; absolute paden moeten ook binnen deze root blijven. Ontsnappingen met symbolische koppelingen worden afgewezen. Bestaande bestanden blijven behouden door nieuwe uitvoerbestandsnamen te kiezen. De invoerschema’s voor voorbeeld en batch vereisen recipe; inspect_images accepteert alleen files. Ongeldige afbeeldingen staan in failures, geldige gaan door. index begint bij 0 in de oorspronkelijke files-array; stage is inspect of render. Het voorbeeld verwerkt alleen files[0], zonder vervanging. Ongeldige verzoeken retourneren isError met een sms-bericht; individuele verwerkingsfouten blijven bestaan in failures. Oproepen zijn verzoek/antwoord en er is geen afbreektool.
MCP retourneert JSON met serienummer in content[0].text, niet in structuredContent. Inspecteren en valideren zijn alleen-lezen; preview- en batchschrijfkopieën. Geen enkele tool uploadt foto's. Een client moet deze lokale stdio-opdracht expliciet configureren voordat hij de tools gebruikt.