Локальные фотоинструменты для разработчиков и помощников
Бесплатные пакетные водяные знаки, метки имен файлов и отметки даты. Откройте для себя возможности, а затем обработайте специально выбранные фотографии на устройстве.
Читать как 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 того же происхождения.
- Каталог возможностей
- Полные рецепты по умолчанию и поддерживаемые текстовые переменные.
- Рецепт JSON Schema (2020-12)
- Локальные входные схемы MCP
- Спецификация обнаружения OpenAPI 3.1
- Дополнительный каталог обнаружения
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 перед использованием инструментов.