水印编辑器 — 使用指南
可视化创建视频水印和 Logo 叠加层。支持图片与文本水印、动态防录屏游走、铺满水印、模板变量和 ZWMAP JSON 导出。
概述
水印编辑器是一款基于浏览器的所见即所得编辑工具,用于创建视频水印配置。输出符合 ZWMAP/1.0 规范的 JSON,可由 ZWPlayer 在播放视频时渲染水印。
核心功能:
- 拖放创建图片水印
- 文本水印,支持模板变量和铺满模式
- 静态停靠、动态游走和铺满三种行为模式
- 视频画布实时预览
- 50 步撤销/重做历史
- JSON 导出 / 导入
- 从剪贴板粘贴图片 (Ctrl+V)
快速入门
- 加载视频:在地址栏粘贴视频 URL,或将本地视频文件拖放到画布区域。
- 添加水印:点击"+ 图片水印"或"+ 文本水印"按钮,也可以直接将图片文件拖放到画布上。
- 可视化编辑:在画布上拖动水印调整位置,拖动角点调整图片大小。右侧面板实时更新属性。
- 配置属性:在详情面板中调整透明度、行为模式、停靠方向、字体设置等。
- 导出:点击"导出 JSON"下载配置文件,或点击"复制"将 JSON 复制到剪贴板。
图层类型
图片水印
用于品牌 Logo、频道图标等静态品牌标识。
- 添加方式:点击"+ 图片"按钮、将图片拖放到画布、或从剪贴板粘贴 (Ctrl+V)
- 图片来源:支持上传本地图片(自动转为 Base64)或直接输入图片 URL 地址
- 支持格式:PNG(推荐,支持透明)、JPG、SVG、WebP
- 宽高比锁定:默认开启,缩放时保持比例
- 行为模式:支持静态停靠和动态游走(不支持铺满模式)
文本水印
用于版权声明、用户追踪、动态信息显示、防录屏保护。
- 模板变量:使用 {key} 语法插入动态内容(见下文)
- 字号范围:10-72px
- 颜色格式:RGBA,默认半透明白色
- 自动尺寸:文本图层宽高自动适应内容
- 行为模式:支持静态停靠、动态游走和铺满三种模式
行为模式
静态停靠
水印固定在指定位置不动。适合品牌 Logo 和固定版权声明。
- 停靠方向:左 或 右 — 决定 X 坐标从哪条边计算。切换方向时坐标值自动转换
- 位置坐标:X/Y 以播放器容器的百分比表示,输入框后会标注参考起点(距左/距右/距顶)
- 尺寸:仅图片水印可手动设置宽高,文本水印自动适配内容大小
动态游走
水印在屏幕上移动。是防录屏保护的关键手段。
- 方向:水平、垂直、对角线 或 随机
- 速度:1-10(影响移动快慢)
- 出现间隔:隐藏后再次出现前的等待秒数(0 = 无间隔)
- 持续时间:每次循环可见的秒数(0 = 始终可见)
- 位置记忆:水印消失后再次出现时,从上次消失的位置继续移动
铺满(仅文本)
文本按倾斜角度和间隔铺满整个屏幕,形成密集的防录屏水印矩阵。仅文本水印支持此模式。
- 倾斜角度:-90° ~ 90°,默认 -30°(逆时针倾斜)
- 行间距:50-300px,控制垂直方向的文字密度
- 列间距:100-600px,控制水平方向的文字密度
模板变量
文本水印支持 {key} 模板变量,在播放时动态解析。
内置变量
| 变量 | 说明 | 更新频率 |
|---|---|---|
{sys_time} | 客户端本地时间 (YYYY-MM-DD HH:mm:ss) | 每秒 |
自定义变量
任意 {key} 均可使用。值在播放时通过 variables 参数传入。
const player = new ZWPlayer({
url: 'video.mp4',
watermarks: config.watermarks,
variables: {
user_id: '138****1234',
user_name: 'John',
department: 'Engineering',
ip_address: '192.168.1.100'
}
});
未解析的变量会在播放器中原样显示。
示例
"Confidential | {department} | {user_name} | {sys_time}"
→ "Confidential | Engineering | John | 2026-05-08 14:30:00"
导出格式
复制 JSON
将 ZWMAP JSON 复制到剪贴板。图片以 Base64 数据 URI 或 URL 原始地址嵌入。
导出 JSON
下载 {title}_watermark.json 文件。
导入 JSON
从本地文件导入 ZWMAP JSON 配置,恢复所有水印图层及其属性。
快捷键
| 快捷键 | 功能 |
|---|---|
| P | 切换预览模式 |
| Space | 播放/暂停视频 |
| Esc | 退出预览 / 取消选中 |
| Delete | 删除选中图层 |
| Ctrl+Z | 撤销 |
| Ctrl+Shift+Z | 重做 |
| Ctrl+S | 导出 JSON |
| Ctrl+V | 从剪贴板粘贴图片 |
ZWMAP 协议
水印编辑器输出符合 ZWMAP/1.0 规范的 JSON:
{
"zwp_protocol": "ZWMAP/1.0",
"zwp_type": "watermark",
"zwp_version": "1.0",
"watermarks": [
{
"id": "wm-1",
"type": "image",
"behavior": "static",
"icon": "logo.png",
"dock": "right",
"x": "5%", "y": "5%",
"width": "15%", "height": "15%",
"opacity": 70
},
{
"id": "wm-2",
"type": "text",
"behavior": "dynamic",
"text": "{user_id} | {sys_time}",
"font_size": 16,
"font_color": "rgba(255,255,255,0.3)",
"opacity": 40,
"movement": {
"direction": "diagonal",
"speed": 2,
"interval": 0,
"duration": 0
}
},
{
"id": "wm-3",
"type": "text",
"behavior": "tile",
"text": "Confidential",
"font_size": 16,
"font_color": "rgba(255,255,255,0.15)",
"opacity": 30,
"tile": {
"angle": -30,
"rowSpacing": 120,
"colSpacing": 300
}
}
]
}
水印格式说明
输入格式
ZWPlayer 支持三种水印传入方式:
- URL 字符串 — 指向 ZWMAP JSON 文件的地址,播放器自动获取并解析。 — A URL pointing to a ZWMAP JSON file; the player fetches and parses it automatically. — A URL pointing to a ZWMAP JSON file; the player fetches and parses it automatically. — A URL pointing to a ZWMAP JSON file. The player fetches and parses it automatically.
- ZWMAP 对象 — 包含完整协议头的 JSON 对象,播放器自动解包内部的 watermarks 数组。 — A JSON object with the full protocol header; the player extracts the inner watermarks array. — A JSON object with the full protocol header; the player extracts the inner watermarks array. — A complete JSON object with protocol headers. The player unwraps the inner
watermarksarray. - 水印数组 — 直接传入水印对象数组,无需协议头。 — A plain array of watermark objects, no protocol header required. — A plain array of watermark objects, no protocol header required. — A plain array of watermark objects, passed directly without protocol headers.
// URL string
watermarks: 'https://example.com/watermark.json'
// ZWMAP object
watermarks: { zwp_protocol: 'ZWMAP/1.0', zwp_type: 'watermark', watermarks: [...] }
// Plain array
watermarks: [{ type: 'image', behavior: 'static', icon: 'logo.png', ... }]
通用字段
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
type | string | — | 必填。 "image" 或 "text" "image" or "text" "image" or "text" "image" or "text" |
behavior | string | "static" | "static"(静态)、"dynamic"(动态游走)或 "tile"(铺满) |
dock | string | "right" | X 轴参考原点:"left"(左边缘)或 "right"(右边缘) |
x | string | "5%" | 水平位置(像素值或百分比) |
y | string | "5%" | 垂直位置(像素值或百分比) |
opacity | number | 70 | 不透明度 0–100 |
hidden | boolean | false | 隐藏此水印 |
图片水印字段
| 字段 | 类型 | 说明 |
|---|---|---|
icon | string | 必填。 图片 URL 或 Base64 data URI Image URL or Base64 data URI Image URL or Base64 data URI Image URL or Base64 data URI |
width | string | 宽度(像素值或百分比),默认 "5%" |
height | string | 高度(像素值、百分比或 "auto") |
文字水印字段
| 字段 | 类型 | 说明 |
|---|---|---|
text | string | 必填。 文本内容,支持 {key} 模板变量 Text content, supports {key} template variables Text content, supports {key} template variables Text content, supports {key} template variables |
font_size | number | 字体大小(px),默认 14 |
font_color | string | 字体颜色(RGBA),默认 "rgba(255,255,255,0.4)" |
动态游走字段
当 behavior 为 "dynamic" 时,添加 movement 对象:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
movement.direction | string | "diagonal" | "horizontal"、"vertical"、"diagonal" 或 "random" |
movement.speed | number | 2 | 移动速度(1–10) |
movement.interval | number | 0 | 隐藏等待时间(秒),0 表示持续显示 |
movement.duration | number | 0 | 每次显示持续时间(秒),0 表示持续显示 |
铺满水印字段
当 behavior 为 "tile"(仅文字)时,添加 tile 对象:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
tile.angle | number | -30 | 倾斜角度(度),-90 到 90 |
tile.rowSpacing | number | 120 | 行间距(px) |
tile.colSpacing | number | 300 | 列间距(px) |
ZWPlayer 集成
将导出的水印配置与 ZWPlayer 配合使用:
// 1. Load JSON configuration
const config = await fetch('watermark.json').then(r => r.json());
// 2. Initialize ZWPlayer with watermark configuration
const player = new ZWPlayer({
playerElm: 'video-container',
url: 'https://example.com/video.mp4',
watermarks: config.watermarks,
variables: {
user_id: '138****1234',
user_name: 'John',
department: 'Engineering'
}
});
集成要点:
- 水印位置基于播放器容器尺寸,而非视频分辨率
- 水印图层使用 pointer-events: none,不会阻挡播放器控件
- {sys_time} 每秒自动更新
- 自定义变量在播放时由 ZWPlayer 传入并解析
- 铺满模式水印覆盖整个视频区域,适合防录屏场景