Foto vattenstämpelGratis · Dina foton stannar på din enhet

Lokala fotoverktyg för utvecklare och assistenter

Gratis batchvattenstämplar, filnamnsetiketter och datumstämplar. Upptäck funktionerna och bearbeta sedan explicit valda foton på enheten.

Läs som Markdown · OpenAPI 3.1 · Receptschema

Välj en utförandeyta

Upptäckten API är offentlig, gratis, skrivskyddad och kräver ingen API-nyckel. Den beskriver verktyg och inställningar; den accepterar aldrig bilder. Det finns ingen POST/vattenstämpel, molnbearbetningstjänst eller värd MCP-slutpunkt.

Använd webbläsaren SDK för explicit valda filer från detta ursprung. För en assistent med åtkomst till lokalt filsystem, anslut arkivets stdio MCP-server explicit och auktorisera en rotkatalog. En modell som hittar den här dokumentationen får inte tillgång till en enhet eller dess filer.

YtaSyfte
HÄMTA JSON / MarkdownUpptäck funktioner, recept, begränsningar och lokala verktygssignaturer.
Webbläsare ESM SDKAvkoda och rendera filer lokalt; kräver Canvas, DOM, createImageBitmap och File/Blob. Inte en Node eller fjärr-HTTP-bearbetning API.
Lokal CLI / stdio MCPExplicit ansluten lokal automatisering med hjälp av installerade Google Chrome och lagringsberoenden.

Offentliga resurser

GET och HEAD returnerar statiska resurser. Ingen autentisering, förfrågningstext, frågeparametrar eller användardata. Okända resurssökvägar returnerar 404. Behandla version 1 som kontraktsversionen; bokmärk kanoniska vägar snarare än hashade byggbitar. Webbläsaråtkomst med flera ursprung utlovas inte; använd SDK-import med samma ursprung.

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

Webbläsare SDK

Importera /sdk/watermark.js från den här webbplatsens ursprung. Detta är en stabil ESM ingångs-URL; implementeringsbitar kan ändras. Följande exempel förväntar sig en inmatning av flera filer och körs efter att användaren valt lokala filer. Det skapar en ZIP av framgångsrika kopior; uppringare måste inspektera failures och cancelled istället för att behandla partiell export som fullständig.

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));
}
FunktionInmatning → resultat
createRecipe(mode)watermark | filename | date | frame → oberoende v1-recept.
validateRecipe(recipe)Recept → sträng[] fel; tomt betyder att konfigurationen är giltig. Semantisk validering kontrollerar också unika ID:n och beskärningsgränser.
inspectImage(file)File → Promise<Record> med id, namn, fil, bredd, höjd, webbadress för miniatyrobjekt, åsidosättningar, metadata, metadataVarning. Återkalla miniatyrbilden när du är klar.{id,name,file,width,height,thumbnail,overrides,metadata,metadataWarning}
renderImage(record, recipe, options?)→ Promise<{blob, geometry}>; preview:true returnerar {canvas, geometry}. alternativ: tillgångar:Map<assetId,ImageBitmap|Canvas>, index:nummer, maxDimension:nummer, canvas:Canvas. missingMetadataText?:string.{blob,geometry} | {canvas,geometry}
processBatch(records, recipe, options?)→ Promise<{entries,failures,cancelled}>. Post: {name,blob,width,height,sourceId}; fel: {id,name,longEdge,message}. alternativ: tillgångar, signal:AbortSignal, onProgress({done,total,failed}), onResult(post). missingMetadataText?:string.{entries:[{name,blob,width,height,sourceId}],failures:[{id,name,longEdge,message}],cancelled}
packageResults(entries)→ Promise<Blob> ZIP; avvisar när den kombinerade uteffekten överstiger 450 MiB.
decodeImage(blob)→ Promise<ImageBitmap>; close() när du är klar. HEIC använder den första avkodade bilden.
parseLabelCsv(text)filename,text CSV → Map<string,string>; exakta namn matchar, dubblettnamn avvisas. Ställ in record.label själv innan bearbetning.
imageRecipe(recipe, record)Slår samman record.overrides.image och record.overrides.layers[id] utan att mutera det delade receptet.
renderStudioImage / cleanLogoLågnivå Canvas-hjälpare; se repository packages/watermark-core/src/studio.js för signaturer. Föredra renderImage för kodad utdata.

Receptregler och fel

Ladda ner fullständiga recept från /api/v1/recipes/watermark.json, filnamn.json, date.json eller frame.json. Validera JSON Schema först, sedan validateRecipe för semantiska kontroller. Lager-ID:n måste vara unika. Beskär x + bredd och y + höjd måste stanna inne i bilden. Storlekar, marginaler, ramar och sidfötter använder procentandelar av den beskurna och roterade bildens kortsida. Utdata longEdge:0 håller storleken; storleksändring skalar aldrig upp. Valfria image.crop.aspectRatio anger innehållets bredd/höjd efter rotation. Varje bild beskärs centrerat inom sitt normaliserade urval även vid olika bildstorlekar. Ram och sidfot läggs till efteråt. Manuella procentvärden tar bort proportioneringsregeln.

Textvariabler: {filename} utesluter tillägg; {fullname} inkluderar det; {index} använder sequence.start och stoppning; {label} använder record.label. Kameravariabler är {camera}, {lens}, {aperture}, {iso}, {shutter}, {focal}. En CSV fyller inte automatiskt i SDK-poster.

Datumförinställningen använder varje bilds DateTimeOriginal eller CreateDate. Inget filändringsdatum ersätts. Saknat datum är som standard en tom datumetikett; missing:error misslyckas med den bilden, missing:custom använder date.custom om det går att analysera. source:custom använder det angivna datumet direkt. Anpassade datum är inte certifierade tidsstämplar. Ogiltiga datum kan ge en tom etikett eller ett fel enligt denna policy.

Ett recept innehåller inställningar, inte logotypbytes eller anpassade typsnitt. Tillhandahåll logotyper genom options.assets inkodade av layer.assetId, och stäng avkodade logotypbitmappar efter användning. Anpassade teckensnitt måste laddas in i document.fonts under deras LocalFont-familj. Saknade resurser misslyckas uttryckligen.

SDK kastar efter ogiltiga recept innan batchkörning. Avkodnings-, renderings-, metadata- eller kodningsfel per bild visas i failures, medan framgångsrika entries förblir tillgängliga. Fel innehåller för närvarande läsbara kinesiska meddelanden; konsumenter bör inte grena på sin text. Annullering kontrolleras mellan utgångar; den aktuella renderingen avbryts inte. Med onResult levereras entries till återuppringningen och behålls inte i den returnerade entries-matrisen.

Gränser och integritet

Ingen kvot för betald fotoräkning, konto, API-nyckel, prenumeration eller tillagd webbplatsvarumärke. Varje ingång är begränsad till 150 MiB och 120 miljoner pixlar; ZIP-utgången är begränsad till 450 MiB. Maximalt 30 lager, 6 extra utdatastorlekar, långsida upp till 32768. Gränserna för webbläsaren Canvas, minne, avkodare och filsystem kan vara lägre; dela upp stora partier.

Utdata är JPEG, PNG eller WebP. JPEG och förlustfri WebP kodas om. Standardmetadataläget är strip. Lägena "safe" och "all" kräver JPEG-utdata. Läget safe utesluter GPS; läget all kan behålla platsmetadata. ICC-profiler, HDR och signaturer bevaras inte. Originalfiler ändras aldrig.

Endast programresurser cachelagras valfritt för offlineanvändning i /studio/.. De nya offentliga sidorna behöver en nätverksanslutning för att laddas initialt. Användarbilder och filnamn skickas inte till den offentliga API eller lagras i förinställningar. Spara/dela ​​endast recept som inte innehåller någon privat text.

Lokal MCP

Denna förmåga tillhandahålls av förvaret, inte en internetändpunkt. Förutsättningar: Node.js, pnpm installeras i förvaret och installerade Google Chrome. Kör servern från förvaret, med en explicit tillåten katalog. Dra inte slutledning av en privat filsystemsökväg från webbsökningsresultat.

node scripts/watermark-mcp.mjs --root /absolute/authorized/photo-folder
VerktygInput och resultat
validate_recipe{recipe} → {errors:string[]}. Läser inte bilder.
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}. Skriver bara den första bilden, längsta kanten ≤1400.
batch_watermark{files,recipe,output?,logos?} → {files:[{path,width,height}],failures,cancelled}. Skriver enskilda bilder, inte en ZIP.

Inmatningsvägar i files löses inuti --root. Kartan "logos" länkar tillgångs-ID:n till sökvägar inom samma rot. Standard output är watermark-output inuti roten; absoluta vägar måste också stanna inom denna rot. Symboliska länkflykter avvisas. Befintliga filer bevaras genom att välja nya utdatafilnamn. Indatascheman för förhandsvisning och batch kräver recipe; inspect_images tar bara files. Ogiltiga bilder listas i failures medan giltiga fortsätter. index börjar på 0 i ursprungliga files; stage är inspect eller render. Förhandsvisningen behandlar bara files[0] utan ersättning. Ogiltiga förfrågningar returnerar isError med ett textmeddelande; individuella bearbetningsfel kvarstår i failures. Samtal är begäran/svar och det finns inget avbrytningsverktyg.

MCP returnerar JSON serialiserad inuti content[0].text, inte structuredContent. Inspektera och validera är skrivskyddade; förhandsgranska och batchskriva kopior. Inget verktyg laddar upp bilder. En klient måste uttryckligen konfigurera detta lokala stdio-kommando innan verktygen används.