# 图像盲水印

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

# 功能特性

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

水印类型 特性 适用场景
半盲水印(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("tcb-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))
  }
}