Foto-WasserzeichenKostenlos · Ihre Fotos bleiben auf Ihrem Gerät

Lokale Fototools für Entwickler und Assistenten

Kostenlose Stapelwasserzeichen, Dateinamenetiketten und Datumsstempel. Entdecken Sie die Möglichkeiten und verarbeiten Sie anschließend explizit ausgewählte Fotos auf dem Gerät.

Als Markdown lesen · OpenAPI 3.1 · Rezeptschema

Wählen Sie eine Ausführungsoberfläche

Die Erkennung API ist öffentlich, kostenlos, schreibgeschützt und erfordert keinen API-Schlüssel. Es beschreibt Werkzeuge und Einstellungen; Es werden niemals Bilder akzeptiert. Es gibt kein POST/Wasserzeichen, keinen Cloud-Verarbeitungsdienst und keinen gehosteten MCP-Endpunkt.

Verwenden Sie den Browser SDK für explizit ausgewählte Dateien auf diesem Ursprung. Für einen Assistenten mit lokalem Dateisystemzugriff verbinden Sie explizit den stdio MCP-Server des Repositorys und autorisieren Sie ein Stammverzeichnis. Ein Modell, das diese Dokumentation findet, erhält keinen Zugriff auf ein Gerät oder seine Dateien.

OberflächeZweck
GET JSON / MarkdownEntdecken Sie Funktionen, Rezepte, Einschränkungen und lokale Toolsignaturen.
Browser ESM SDKDateien lokal dekodieren und rendern; erfordert Canvas, DOM, createImageBitmap und File/Blob. Kein Node oder Remote-HTTP-Verarbeitung API.
Lokale CLI / stdio MCPExplizit verbundene lokale Automatisierung mithilfe installierter Google Chrome- und Repository-Abhängigkeiten.

Öffentliche Ressourcen

GET und HEAD geben statische Ressourcen zurück. Keine Authentifizierung, kein Anforderungstext, keine Abfrageparameter oder Benutzerdaten. Unbekannte Ressourcenpfade geben 404 zurück. Behandeln Sie Version 1 als Vertragsversion; Setzen Sie Lesezeichen für kanonische Pfade anstelle von gehashten Build-Blöcken. Ein herkunftsübergreifender Browserzugriff wird nicht versprochen; Verwenden Sie SDK-Importe mit demselben Ursprung.

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

Browser SDK

Importieren Sie /sdk/watermark.js auf dem Ursprung dieser Site. Dies ist eine stabile ESM-Eintrags-URL; Implementierungsblöcke können sich ändern. Das folgende Beispiel erwartet eine Eingabe mehrerer Dateien und wird ausgeführt, nachdem der Benutzer lokale Dateien ausgewählt hat. Es wird ein ZIP erfolgreicher Kopien erstellt. Aufrufer müssen failures und cancelled prüfen, anstatt den teilweisen Export als abgeschlossen zu betrachten.

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));
}
FunktionEingabe → Ergebnis
createRecipe(mode)watermark | filename | date | frame → unabhängiges v1-Rezept.
validateRecipe(recipe)Rezept → string[] Fehler; leer bedeutet, dass die Konfiguration gültig ist. Bei der semantischen Validierung werden auch eindeutige IDs und Zuschneidegrenzen überprüft.
inspectImage(file)File → Promise<Record> mit ID, Name, Datei, Breite, Höhe, Miniaturbild-Objekt-URL, Überschreibungen, Metadaten, Metadatenwarnung. Miniaturansicht widerrufen, wenn Sie fertig sind.{id,name,file,width,height,thumbnail,overrides,metadata,metadataWarning}
renderImage(record, recipe, options?)→ Promise<{blob, geometry}>; preview:true gibt {canvas, geometry} zurück. Optionen: Assets:Map<assetId,ImageBitmap|Canvas>, Index:Nummer, MaxDimension:Nummer, Leinwand:Canvas. missingMetadataText?:string.{blob,geometry} | {canvas,geometry}
processBatch(records, recipe, options?)→ Promise<{entries,failures,cancelled}>. Eintrag: {name,blob,width,height,sourceId}; Fehler: {id,name,longEdge,message}. Optionen: Vermögenswerte, Signal:AbortSignal, onProgress({done,total,failed}), onResult(Eintrag). missingMetadataText?:string.{entries:[{name,blob,width,height,sourceId}],failures:[{id,name,longEdge,message}],cancelled}
packageResults(entries)→ Promise<Blob> ZIP; wird abgelehnt, wenn die Gesamtausgabe 450 MiB überschreitet.
decodeImage(blob)→ Promise<ImageBitmap>; close(), wenn Sie fertig sind. HEIC verwendet das erste dekodierte Bild.
parseLabelCsv(text)filename,text CSV → Map<string,string>; Genaue Namensübereinstimmungen, doppelte Namen werden abgelehnt. Stellen Sie record.label vor der Verarbeitung selbst ein.
imageRecipe(recipe, record)Führt record.overrides.image und record.overrides.layers[id] zusammen, ohne das gemeinsame Rezept zu ändern.
renderStudioImage / cleanLogoLow-Level-Helfer Canvas; Signaturen finden Sie im Repository packets/watermark-core/src/studio.js. Bevorzugen Sie renderImage für die codierte Ausgabe.

Rezeptregeln und Fehler

Laden Sie vollständige Rezepte von /api/v1/recipes/watermark.json, Dateiname.json, Datum.json oder Frame.json herunter. Validieren Sie zuerst JSON Schema und dann validateRecipe für semantische Prüfungen. Layer-IDs müssen eindeutig sein. Der Zuschnitt x + Breite und y + Höhe muss innerhalb des Bildes bleiben. Größen, Ränder, Ränder und Fußzeilen verwenden Prozentsätze der kurzen Kante des zugeschnittenen und gedrehten Bildes. Ausgabe longEdge:0 behält Größe; Eine Größenänderung führt nie zu einer Hochskalierung. Das optionale image.crop.aspectRatio bestimmt Breite/Höhe des Inhalts nach der Drehung. Jede Auswahl wird pro Bild zentriert zugeschnitten, auch bei unterschiedlichen Bildgrößen. Rahmen und Fußzeile folgen danach. Manuelle Prozentwerte heben die Verhältnisregel auf.

Textvariablen: {filename} schließt Erweiterung aus; {fullname} enthält es; {index} verwendet sequence.start und Polsterung; {label} verwendet record.label. Kameravariablen sind {camera}, {lens}, {aperture}, {iso}, {shutter}, {focal}. Ein CSV füllt SDK-Datensätze nicht automatisch auf.

Die Datumsvoreinstellung verwendet DateTimeOriginal oder CreateDate jedes Bildes. Es wird kein Dateiänderungsdatum ersetzt. Bei fehlendem Datum wird standardmäßig eine leere Datumsbeschriftung angezeigt. missing:error schlägt dieses Bild fehl, missing:custom verwendet date.custom, wenn es analysierbar ist. source:custom verwendet direkt das angegebene Datum. Benutzerdefinierte Datumsangaben sind keine zertifizierten Zeitstempel. Ungültige Daten können gemäß dieser Richtlinie zu einem leeren Etikett oder einem Fehler führen.

Ein Rezept enthält Einstellungen, keine Logo-Bytes oder benutzerdefinierten Schriftarten. Stellen Sie Logos über options.assets mit dem Schlüssel layer.assetId bereit und schließen Sie dekodierte Logo-Bitmaps nach der Verwendung. Benutzerdefinierte Schriftarten müssen unter ihrer LocalFont-Familie in document.fonts geladen werden. Fehlende Ressourcen schlagen explizit fehl.

Der SDK löst vor der Stapelausführung ungültige Rezepte aus. In failures treten pro Bild Dekodier-, Render-, Metadaten- oder Kodierungsfehler auf, während erfolgreiche entries weiterhin verfügbar sind. Fehler enthalten derzeit für Menschen lesbare chinesische Nachrichten; Verbraucher sollten ihren Text nicht verzweigen. Die Stornierung wird zwischen den Ausgaben überprüft; Das aktuelle Rendern wird nicht unterbrochen. Mit onResult werden entries an den Rückruf übermittelt und nicht im zurückgegebenen entries-Array beibehalten.

Grenzen und Privatsphäre

Kein kostenpflichtiges Fotozählkontingent, Konto, API-Schlüssel, Abonnement oder zusätzliches Site-Branding. Jede Eingabe ist auf 150 MiB und 120 Millionen Pixel begrenzt; Die Ausgabe von ZIP ist auf 450 MiB begrenzt. Maximal 30 Ebenen, 6 zusätzliche Ausgabegrößen, lange Kante bis zu 32768. Browser Canvas, Speicher-, Decoder- und Dateisystemgrenzen können niedriger sein; große Chargen aufteilen.

Die Ausgaben sind JPEG, PNG oder WebP. JPEG und verlustbehaftetes WebP werden neu kodiert. Der Standard-Metadatenmodus ist „strip“. Die Modi „safe“ und „all“ erfordern eine JPEG-Ausgabe. Der Modus „safe“ schließt GPS aus; Der Modus „all“ kann Standortmetadaten beibehalten. ICC-Profile, HDR und Signaturen bleiben nicht erhalten. Originaldateien werden niemals verändert.

Für die Offline-Nutzung unter /studio/ werden ausschließlich Programmdateien zwischengespeichert. Die neuen öffentlichen Seiten benötigen zum ersten Laden eine Netzwerkverbindung. Benutzerbilder und Dateinamen werden weder an die öffentliche API gesendet noch in Vorlagen gespeichert. Speichern oder teilen Sie nur Rezepte ohne private Texte.

Lokal MCP

Diese Funktion wird vom Repository bereitgestellt, nicht von einem Internet-Endpunkt. Voraussetzungen: Node.js, pnpm im Repository installieren und Google Chrome installieren. Führen Sie den Server aus dem Repository aus, mit einem explizit erlaubten Verzeichnis. Leiten Sie aus Websuchergebnissen keinen privaten Dateisystempfad ab.

node scripts/watermark-mcp.mjs --root /absolute/authorized/photo-folder
WerkzeugEingabe und Ergebnis
validate_recipe{recipe} → {errors:string[]}. Liest keine 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}. Schreibt nur das erste Bild, längste Kante ≤1400.
batch_watermark{files,recipe,output?,logos?} → {files:[{path,width,height}],failures,cancelled}. Schreibt einzelne Bilder, kein ZIP.

Eingabepfade in „files“ werden in „--root“ aufgelöst. Die Karte „logos“ verknüpft Asset-IDs mit Pfaden innerhalb desselben Stammverzeichnisses. Der Standardwert „output“ ist „watermark-output“ im Stammverzeichnis; Auch absolute Pfade müssen innerhalb dieses Stammverzeichnisses bleiben. Symbolische Link-Escapezeichen werden abgelehnt. Vorhandene Dateien bleiben erhalten, indem neue Ausgabedateinamen ausgewählt werden. Die Eingabeschemas für Vorschau und Stapel verlangen recipe; inspect_images akzeptiert nur files. Fehlerhafte Bilder stehen in failures, gültige werden weiterverarbeitet. index zählt ab 0 im ursprünglichen files-Array; stage ist inspect oder render. Die Vorschau verarbeitet nur files[0] ohne Ersatzdatei. Ungültige Anfragen geben „isError“ mit einer Textnachricht zurück; Einzelne Verarbeitungsfehler verbleiben in „failures“. Anrufe sind Anfrage/Antwort und es gibt kein Abbruchtool.

MCP gibt JSON serialisiert in content[0].text zurück, nicht structuredContent. „Inspizieren“ und „Validieren“ sind schreibgeschützt. Vorschau und Batch-Schreiben von Kopien. Kein Tool lädt Fotos hoch. Ein Client muss diesen lokalen stdio-Befehl explizit konfigurieren, bevor er die Tools verwenden kann.