图像盲水印
图像盲水印将水印信息以不可见的形式添加到原图信息中,您可对疑似被盗取的资源进行盲水印提取,验证图片归属。
功能特性
开通后,每个账户拥有三千次免费额度,超出后进行计费。为您提供半盲、全盲和文字盲水印三种类型,您可根据需要进行选择:
水印类型 | 特性 | 适用场景 |
---|---|---|
半盲水印(type1) | 抗攻击性强,但提取水印需原图 | 小图(640x640 以下)使用 |
全盲水印(type2) | 提取方便,提取水印仅需水印图 | 无需对比原图 批量添加,批量校验 |
文字水印(type3) | 可直接将文字信息添加至图片中 | 终端信息添加 |
适用场景
鉴权追责
您可对图片资源增加半盲水印,在发现恶意攻击方盗取您的资源后将疑似被盗取图取回,并与相应原图进行盲水印提取操作,若能够得到有效水印图即可证明资源归属。
上传查重
为解决部分用户使用其他用户资源重复上传相同信息的问题(如房产图、汽车图、商品图等),您可在用户上传图片资源前先进行全盲水印提取,若提取到水印图信息则证明该图片来自之前已有资源,并进行相应操作(如提醒用户请勿重复上传资源);若不存在全盲水印则添加全盲水印,保护图片资源不被其他用户下载后重复上传。
资源防泄露
对于内部分享的图片资源,您可通过文字盲水印将访问方的信息在请求图片时添加至图片中,当资源泄露后可通过流传出的资源图提取出盲水印,进而得到泄露方信息。
!您不仅在云函数中可以使用该扩展能力,也可以在客户端使用,文件读写权限策略与云存储一致,减去您额外的权限管理工作。
前置要求
已经开通云开发。
扩展配置信息
您可以通过以下配置参数:
- 环境 ID:选择要部署的环境,在哪个环境下使用。
计费
此扩展使用云开发或其他腾讯云服务,可能会产生相关费用:
当您使用云开发扩展时,您只需要为您使用的云资源付费;云开发与云上其他资源分开计费,您可以在 费用中心 查看具体信息。
启用的 API 和创建的资源
- Type: 数据万象 Description: 为开发者提供图片、视频等多种数据的智能处理服务。
- Type: Cloud Storage Description: 存储图片,并通过 CDN 提升图片加载速度。
- Type: Cloud Function Description: 检测图像处理参数并为图像处理生成签名,保证操作的合法性。
权限授予
主账户
角色名称 | 授权策略名 | 角色类型 | 描述 |
---|---|---|---|
CI_QCSRole | QcloudAccessForCIRole、QcloudCOSDataFullControl | 服务角色 | 数据万象(CI)会对您腾讯云资源进行访问操作,含对对象存储(COS)数据的读取、修改、删除、列出等 |
TCB_QcsRole | QcloudCIFullAccess | 服务角色 | 云开发(TCB)会对您的数据万象资源进行操作,方便您在扩展能力中使用该服务 |
子账户
如果想让子账户也能使用该扩展,需要为子账户授予如下权限才能使用:
- 策略: QcloudAccessForTCBRole 描述: 云开发(TCB)对云资源的访问权限。
- 策略: QcloudCIFullAccess 描述: 数据万象全读写访问权限。
安装扩展
您可以通过 云开发控制台,来安装和管理扩展。
使用扩展
!如果您在 web 网站使用该扩展,请先在 云开发控制台 将网站域名添加为当前环境的安全域名。其他要求如下:
- 使用盲水印功能,水印图的宽高不得超过原图的 1/8。
- 为保证盲水印效果,水印图请选用黑底白色图片。
- 数据万象为每个账户提供每月 3000 张的免费体验额度,超出后将正常计费。未使用额度不会累积至下一月。
- 文字盲水印当前支持数字[0 - 9]及英文大小写[A - Z,a - z]。
- 盲水印可抵抗裁剪、涂抹、变色等多种图片盗取攻击,防盗效果与原图大小及攻击程度相关。
下载时添加水印
图片下载时添加盲水印与添加普通水印操作相同,只需在图片访问链接后使用 watermark 参数即可。相关内容如下:
watermark/3/type/<type>/image/<imageUrl>/text/<text>
// 例如:http://xxxxx.tcb.qcloud.la/demo.jpeg?watermark/3/type/3/text/dGVuY2VudCBjbG91ZA==
水印参数取值如:
参数 | 类型 | 必选 | 描述 |
---|---|---|---|
type | Int | 是 | 盲水印类型,有效值:1 半盲;2 全盲;3 文字 |
image | String | 否 | 水印图片地址,需要经过 URL 安全的 Base64 编码。 当 type 为 1 或 2 时必填,type 为 3 时无效。 须同时满足 3 个条件: 1. 水印图片存储在当前环境的云存储中; 2. 将您的文件访问域名中 tcb.qcloud.la 替换为 picsh.myqcloud.com 即可,如:examplebucket-1250000000.picsh.myqcloud.com ; 3. URL 必须以 http:// 开始。 |
text | String | 是 | 盲水印文字,需要经过 URL 安全的 Base64 编码。当 type 为 3 时必填,type 为 1 或 2 时无效。 |
上传图片并添加水印及提取水印
1. 安装扩展 SDK 到项目
npm install --save @cloudbase/extension-ci@latest
2. 调用扩展 SDK
调用参数
名称 | 类型 | 是否必须 | 说明 |
---|---|---|---|
action | String | 是 | 操作类型,传:WaterMark |
cloudPath | String | 是 | 文件的绝对路径,与 tcb.uploadFile 中一致 |
fileContent | Uint8Array 或 Buffer | 否 | 文件内容, 有值,表示上传时处理图像;为空,则处理已经上传的图像 |
operations | Object | 是 | 盲水印处理参数 |
operations 节点内容
名称 | 类型 | 是否必须 | 说明 |
---|---|---|---|
rules | Array.<Rule 对象> | 是 | 处理样式 |
Rule 对象内容
名称 | 类型 | 是否必须 | 说明 |
---|---|---|---|
fileid | String | 是 | 处理结果的文件路径,如以’/’开头,则存入指定文件夹中,否则,存入原图文件存储的同目录 |
rule | Object | 是 | 处理参数 |
添加水印处理参数(rule)取值如下:
参数 | 类型 | 必选 | 描述 |
---|---|---|---|
mode | Int | 是 | 操作类型,固定为 3,添加水印 |
type | Int | 是 | 盲水印类型,有效值:1 半盲;2 全盲;3 文字,必须跟添加盲水印时的 type 类型一致 |
image | String | 否 | 盲水印图片地址,当前环境云存储中的路径 |
text | String | 否 | 盲水印文字,当 type 为 3 时必填,type 为 1 或 2 时无效。 |
提取水印处理参数(rule)取值如下:
参数 | 类型 | 必选 | 描述 |
---|---|---|---|
mode | Int | 是 | 操作类型,固定为 4,提取水印 |
type | Int | 是 | 盲水印类型,有效值:1 半盲;2 全盲;3 文字,必须跟添加盲水印时的 type 类型一致 |
image | String | 否 | 图片地址,当 type 为 1 或 2 时必填,type 为 3 时无效。 type 为 1 时,为未带盲水印的原图图片地址;type 为 2 时,为已经添加盲水印的图地址 |
text | String | 否 | 盲水印文字,当 type 为 3 时必填,type 为 1 或 2 时无效 |
返回内容
参数名称 | 类型 | 描述 |
---|---|---|
UploadResult | Object | 原图信息 |
UploadResult 节点内容:
参数名称 | 类型 | 描述 |
---|---|---|
ProcessResults | Object | 图片处理结果 |
ProcessResults 节点内容:
节点名称 | 类型 | 描述 |
---|---|---|
Object | Object | 每一个图片处理结果 |
Object 节点内容:
节点名称 | 类型 | 描述 |
---|---|---|
Key | String | 文件名 |
Location | String | 图片路径 |
Format | String | 图片格式 |
Width | Int | 图片宽度 |
Height | Int | 图片高度 |
Size | Int | 图片大小 |
Quality | Int | 图片质量 |
WatermarkStatus | Int | 提取盲水印且当 type 为 2 时返回该字段,表示提取到全盲水印的可信度。具体为 0-100 的数字,75 分以上表示确定有盲水印,60-75 表示疑似有盲水印,60 以下可认为未提取到盲水印 |
调用示例
客户端使用:
const extCi = require("@cloudbase/extension-ci");
const tcb = require("@cloudbase/js-sdk");
const readFile = async function(file) {
let reader = new FileReader();
let res = await new Promise(resolve => {
reader.onload = function(e) {
let arrayBuffer = new Uint8Array(e.target.result);
resolve(arrayBuffer);
};
reader.readAsArrayBuffer(file);
});
return res;
};
let file = document.getElementById("selectFile").files[0];
let fileContent = await readFile(file);
云函数中使用:
const extCi = require("@cloudbase/extension-ci");
const tcb = require("@cloudbase/node-sdk");
let fileContent = imageBuffer; // Uint8Array|Buffer格式图像内容
您可以根据需要选择在【客户端】或【云函数】中使用,再按照如下代码调用:
const app = tcb.init({
env: "您的环境ID"
});
app.registerExtension(extCi);
async function addWaterMark() {
try {
const opts = {
rules: [
{
// 处理结果的文件路径,如以’/’开头,则存入指定文件夹中,否则,存入原图文件存储的同目录
fileid: "/watermark/demo.jpeg",
rule: {
// 添加水印处理规则
mode: 3,
type: 3,
text: "tcb" // 支持数字[0 - 9]及英文大小写[A - Z,a - z]
}
}
]
};
const res = await app.invokeExtension("CloudInfinite", {
action: "WaterMark",
cloudPath: "demo.jpeg", // 存储图像的绝对路径,与tcb.uploadFile中一致
fileContent, // 该字段可选,文件内容:Uint8Array|Buffer。有值,表示上传时处理图像;为空,则处理已经上传的图像
operations: opts
});
console.log(JSON.stringify(res.data, null, 4));
} catch (err) {
console.log(JSON.stringify(err, null, 4));
}
}
async function getWaterMark() {
try {
const opts = {
rules: [
{
fileid: "/watermark/demo.jpeg",
rule: {
// 提取水印处理规则
mode: 4,
type: 1,
image: "/tcb.jpeg"
}
}
]
};
const res = await app.invokeExtension("CloudInfinite", {
action: "WaterMark",
cloudPath: "demo.jpeg", // 存储图像的绝对路径,与tcb.uploadFile中一致
operations: opts
});
console.log(JSON.stringify(res.data, null, 4));
} catch (err) {
console.log(JSON.stringify(err, null, 4));
}
}