跳到主要内容

图像盲水印

图像盲水印将水印信息以不可见的形式添加到原图信息中,您可对疑似被盗取的资源进行盲水印提取,验证图片归属。

功能特性

开通后,每个账户拥有三千次免费额度,超出后进行计费。为您提供半盲、全盲和文字盲水印三种类型,您可根据需要进行选择:

水印类型特性适用场景
半盲水印(type1)抗攻击性强,但提取水印需原图小图(640x640 以下)使用
全盲水印(type2)提取方便,提取水印仅需水印图无需对比原图 批量添加,批量校验
文字水印(type3)可直接将文字信息添加至图片中终端信息添加

适用场景

鉴权追责

您可对图片资源增加半盲水印,在发现恶意攻击方盗取您的资源后将疑似被盗取图取回,并与相应原图进行盲水印提取操作,若能够得到有效水印图即可证明资源归属。

上传查重

为解决部分用户使用其他用户资源重复上传相同信息的问题(如房产图、汽车图、商品图等),您可在用户上传图片资源前先进行全盲水印提取,若提取到水印图信息则证明该图片来自之前已有资源,并进行相应操作(如提醒用户请勿重复上传资源);若不存在全盲水印则添加全盲水印,保护图片资源不被其他用户下载后重复上传。

资源防泄露

对于内部分享的图片资源,您可通过文字盲水印将访问方的信息在请求图片时添加至图片中,当资源泄露后可通过流传出的资源图提取出盲水印,进而得到泄露方信息。

!您不仅在云函数中可以使用该扩展能力,也可以在客户端使用,文件读写权限策略与云存储一致,减去您额外的权限管理工作。

前置要求

已经开通云开发。

扩展配置信息

您可以通过以下配置参数:

  • 环境 ID:选择要部署的环境,在哪个环境下使用。

计费

此扩展使用云开发或其他腾讯云服务,可能会产生相关费用:

当您使用云开发扩展时,您只需要为您使用的云资源付费;云开发与云上其他资源分开计费,您可以在 费用中心 查看具体信息。

启用的 API 和创建的资源

  • Type: 数据万象 Description: 为开发者提供图片、视频等多种数据的智能处理服务。
  • Type: Cloud Storage Description: 存储图片,并通过 CDN 提升图片加载速度。
  • Type: Cloud Function Description: 检测图像处理参数并为图像处理生成签名,保证操作的合法性。

权限授予

主账户

角色名称授权策略名角色类型描述
CI_QCSRoleQcloudAccessForCIRole、QcloudCOSDataFullControl服务角色数据万象(CI)会对您腾讯云资源进行访问操作,含对对象存储(COS)数据的读取、修改、删除、列出等
TCB_QcsRoleQcloudCIFullAccess服务角色云开发(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==

水印参数取值如:

参数类型必选描述
typeInt盲水印类型,有效值:1 半盲;2 全盲;3 文字
imageString水印图片地址,需要经过 URL 安全的 Base64 编码。 当 type 为 1 或 2 时必填,type 为 3 时无效。 须同时满足 3 个条件:
1. 水印图片存储在当前环境的云存储中;
2. 将您的文件访问域名中 tcb.qcloud.la 替换为 picsh.myqcloud.com 即可,如:examplebucket-1250000000.picsh.myqcloud.com ;
3. URL 必须以 http:// 开始。
textString盲水印文字,需要经过 URL 安全的 Base64 编码。当 type 为 3 时必填,type 为 1 或 2 时无效。

上传图片并添加水印及提取水印

1. 安装扩展 SDK 到项目

npm install --save @cloudbase/extension-ci@latest

2. 调用扩展 SDK

调用参数

名称类型是否必须说明
actionString操作类型,传:WaterMark
cloudPathString文件的绝对路径,与 tcb.uploadFile 中一致
fileContentUint8Array 或 Buffer文件内容, 有值,表示上传时处理图像;为空,则处理已经上传的图像
operationsObject盲水印处理参数

operations 节点内容

名称类型是否必须说明
rulesArray.<Rule 对象>处理样式

Rule 对象内容

名称类型是否必须说明
fileidString处理结果的文件路径,如以’/’开头,则存入指定文件夹中,否则,存入原图文件存储的同目录
ruleObject处理参数

添加水印处理参数(rule)取值如下:

参数类型必选描述
modeInt操作类型,固定为 3,添加水印
typeInt盲水印类型,有效值:1 半盲;2 全盲;3 文字,必须跟添加盲水印时的 type 类型一致
imageString盲水印图片地址,当前环境云存储中的路径
textString盲水印文字,当 type 为 3 时必填,type 为 1 或 2 时无效。

提取水印处理参数(rule)取值如下:

参数类型必选描述
modeInt操作类型,固定为 4,提取水印
typeInt盲水印类型,有效值:1 半盲;2 全盲;3 文字,必须跟添加盲水印时的 type 类型一致
imageString图片地址,当 type 为 1 或 2 时必填,type 为 3 时无效。 type 为 1 时,为未带盲水印的原图图片地址;type 为 2 时,为已经添加盲水印的图地址
textString盲水印文字,当 type 为 3 时必填,type 为 1 或 2 时无效

返回内容

参数名称类型描述
UploadResultObject原图信息

UploadResult 节点内容:

参数名称类型描述
ProcessResultsObject图片处理结果

ProcessResults 节点内容:

节点名称类型描述
ObjectObject每一个图片处理结果

Object 节点内容:

节点名称类型描述
KeyString文件名
LocationString图片路径
FormatString图片格式
WidthInt图片宽度
HeightInt图片高度
SizeInt图片大小
QualityInt图片质量
WatermarkStatusInt提取盲水印且当 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 =&gt; {
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));
}
}