Фото водяной знакБесплатно · Ваши фотографии останутся на вашем устройстве.

Локальные фотоинструменты для разработчиков и помощников

Бесплатные пакетные водяные знаки, метки имен файлов и отметки даты. Откройте для себя возможности, а затем обработайте специально выбранные фотографии на устройстве.

Читать как Markdown · OpenAPI 3.1 · Схема рецепта

Выберите поверхность исполнения

Открытие API является общедоступным, бесплатным, доступным только для чтения и не требует ключа API. Здесь описаны инструменты и настройки; он никогда не принимает изображения. Нет POST/водяного знака, службы облачной обработки или размещенной конечной точки MCP.

Используйте браузер SDK для явно выбранных файлов этого происхождения. Для помощника с доступом к локальной файловой системе явно подключите сервер stdio MCP репозитория и авторизуйте корневой каталог. Модель, обнаружившая эту документацию, не получает доступа к устройству или его файлам.

ПоверхностьЦель
ПОЛУЧИТЬ JSON / УценкаОткройте для себя возможности, рецепты, ограничения и особенности локальных инструментов.
Браузер ESM SDKДекодирование и рендеринг файлов локально; требуются Canvas, DOM, createImageBitmap и File/Blob. Не Node или удаленная обработка HTTP API.
Локальный CLI/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 из источника этого сайта. Это стабильный URL-адрес записи ESM; фрагменты реализации могут измениться. Следующий пример предполагает ввод нескольких файлов и запускается после того, как пользователь выбирает локальные файлы. Он создает 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)Рецепт → ошибки string[]; пусто означает, что конфигурация действительна. Семантическая проверка также проверяет уникальные идентификаторы и границы обрезки.
inspectImage(file)File → Promise<Record> с идентификатором, именем, файлом, шириной, высотой, URL-адресом объекта миниатюры, переопределениями, метаданными, предупреждением о метаданных. Отменить миниатюру, когда закончите.{id,name,file,width,height,thumbnail,overrides,metadata,metadataWarning}
renderImage(record, recipe, options?)→ Promise<{blob, geometry}>; preview:true возвращает {canvas, geometry}. параметры: активы: Map<assetId,ImageBitmap|Canvas>, индекс:номер, maxDimension:число, холст: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 МБ.
decodeImage(blob)→ Promise<ImageBitmap>; close() после завершения. HEIC использует первое декодированное изображение.
parseLabelCsv(text)filename,text CSV → Map<строка,строка>; точное совпадение имен, повторяющиеся имена отклоняются. Установите record.label самостоятельно перед обработкой.
imageRecipe(recipe, record)Объединяет record.overrides.image и Record.overrides.layers[id] без изменения общего рецепта.
renderStudioImage / cleanLogoПомощники низкого уровня Canvas; см. репозиторий packages/watermark-core/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 напрямую использует предоставленную дату. Пользовательские даты не являются сертифицированными метками времени. В соответствии с этой политикой неверные даты могут привести к пустой метке или ошибке.

Рецепт содержит настройки, а не байты логотипа или пользовательские шрифты. Предоставляйте логотипы через options.assets с ключом layer.assetId и закрывайте декодированные растровые изображения логотипов после использования. Пользовательские шрифты необходимо загрузить в document.fonts из семейства LocalFont. Отсутствующие ресурсы явно терпят неудачу.

SDK выдает ошибку о недопустимых рецептах перед выполнением пакета. Ошибки декодирования, рендеринга, метаданных или кодирования каждого изображения появляются в failures, тогда как успешный entries остается доступным. Ошибки в настоящее время содержат удобочитаемые сообщения на китайском языке; потребители не должны переходить по тексту. Отмена проверяется между выходами; текущий рендеринг не прерывается. При использовании onResult entries доставляются обратному вызову и не сохраняются в возвращаемом массиве entries.

Ограничения и конфиденциальность

Никакой платной квоты на подсчет фотографий, учетной записи, ключа API, подписки или дополнительного брендинга сайта. Каждый вход ограничен 150 МБ и 120 миллионами пикселей; Вывод ZIP ограничен 450 МБ. Максимум 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 начинается с 0 в исходном массиве files; stage — inspect или render. Предпросмотр обрабатывает только files[0], без замены другим файлом. Недействительные запросы возвращают isError с текстовым сообщением; отдельные ошибки обработки остаются в failures. Вызовы представляют собой запрос/ответ, и инструмента прерывания нет.

MCP возвращает JSON, сериализованный внутри content[0].text, а не structuredContent. Проверка и проверка доступны только для чтения; предварительный просмотр и пакетная запись копий. Ни один инструмент не загружает фотографии. Клиент должен явно настроить эту локальную команду stdio перед использованием инструментов.