图片水印的作用想必大家都很了解了。目的就是保护版权,防止被盗,保障作者的劳动成果。那么什么是盲水印呢,简单的说就是---“看不见的水印”。腾讯云目前就提供了盲水印的制作和提取功能。

https://cloud.tencent.com/document/product/460/19017

主要场景

鉴权追责

上传查重

资源防泄露

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

使用说明:

  • 使用盲水印功能,水印图的宽高不得超过原图的1/8。
  • 为保证盲水印效果,水印图请选用黑底白色图片。
  • 数据万象为每个账户提供每月3000张的免费体验额度,超出后将正常计费。未使用额度不会累积至下一月。

接下来,我们做一个“上传时添加”盲水印的实践。根据COS的API,来实现一个对象的上传

https://cloud.tencent.com/document/product/436/7749

首先我们做了一个水印图片

http://sunweitest-1251956900.picbj.myqcloud.com/blind.png

水印图片

实现盲水印的方法很简单,只需要在Request的Header中增加一个Pic-Operations

请求内容

Pic-Operations 为 json 格式的字符串,具体参数如下:

参数名称 类型 必选 描述
is_pic_info Int 是否返回原图信息。0表示不返回原图信息,1表示返回原图信息,默认为0
rules Array 处理规则,一条规则对应一个处理结果(目前最多支持五条规则),不填则不进行图片处理

rules(json 数组)中每一项具体参数如下:

参数名称 类型 必选 描述
bucket String 存储结果的目标 bucket 名称,格式为:BucketName-APPID,如果不指定的话默认保存到当前 bucket
fileid String 处理结果的文件路径名称,如以’/’开头,则存入指定文件夹中,否则,存入原图文件存储的同目录
rule String 处理参数,参见数据万象图片处理 API。 若按指定样式处理,则以”style/”开头,后加样式名,如样式名为”test”,则 rule 字段为”style/test”

使用盲水印需在 rule 中添加水印图参数(watermark),相关内容如下:

watermark/3/type/<type>/image/<imageUrl>/text/<text>

参数说明

参数 类型 必选 描述
type Int 盲水印类型,有效值:1 半盲;2 全盲;3 文字
image String 盲水印图片地址,需要经过 URL 安全的 Base64 编码。 当 type 为1或2时必填,type 为3时无效。 指定的水印图片必须同时满足如下 3 个条件: 1. 盲水印图片与原图片必须位于同一个对象存储桶下; 2. URL 需使用数据万象源站域名(不能使用 CDN 加速、COS 源站域名),如:examplebucket-1250000000.image.myqcloud.com 属于 CDN 加速域名,不能在水印 URL 中使用; 3. URL 必须以 http:// 开始,不能省略 http 头,也不能填 https 头,如:examplebucket-1250000000.picsh.myqcloud.com/shuiyin_2.png,https://examplebucket-1250000000.picsh.myqcloud.com/shuiyin_2.png 就是非法的水印 URL。
text String 盲水印文字,需要经过 URL 安全的 Base64 编码。当 type 为3时必填,type 为1或2时无效。

例如我们的信息为:Pic-Operations: {"is_pic_info":1,"rules":{"fileid":"example_blind.jpg","rule":"watermark/3/type/2/image/aHR0cDovL3N1bndlaXRlc3QtMTI1MTk1NjkwMC5waWNiai5teXFjbG91ZC5jb20vYmxpbmQucG5n"}}

解释出来就是:在上传对象的时候生成一个加入全盲水印的新图片,新图片名称是example_blind.jpg,水印内容为http://sunweitest-1251956900.picbj.myqcloud.com/blind.png

代码片段:

代码片段ttp请求的对象
myRequest = (HttpWebRequest)WebRequest.Create(url);

//设置
myRequest.ProtocolVersion = HttpVersion.Version10;
myRequest.Method = type;

// 读取图片内容
FileInfo fi = new FileInfo("D:/test/8.jpg");//某个已知路径的文件
System.IO.FileStream fs1 = fi.OpenRead();

byte[] buf = new byte[fs1.Length];
fs1.Read(buf, 0, buf.Length);
fs1.Close();

myRequest.ContentType = "image/jpeg";
myRequest.ContentLength = buf.Length;//设置读取图片对象的大小

string watermarkurl = "http://sunweitest-1251956900.picbj.myqcloud.com/blind.png";
//盲水印添加
myRequest.Headers.Add("Pic-Operations", "{\"is_pic_info\":1,\"rules\":[{\"fileid\":\"example_blind.jpg\",\"rule\":\"watermark/3/type/2/image/"+ EncodeBase64(watermarkurl) + "\"}]}");

outstream = myRequest.GetRequestStream();
outstream.Flush();
outstream.Write(buf, 0, buf.Length);
outstream.Flush();
outstream.Close();

然后得到上传结果

<UploadResult>
        <OriginalInfo>
                <Key>example.jpg</Key>
                <Location>sunweitest-1251956900.cos.ap-beijing.myqcloud.com/example.jpg</Location>
                <ImageInfo>
                        <Format>JPEG</Format>
                        <Width>1024</Width>
                        <Height>690</Height>
                        <Quality>64</Quality>
                        <Ave>0x4b6d78</Ave>
                        <Orientation>0</Orientation>
                </ImageInfo>
        </OriginalInfo>
        <ProcessResults>
                <Object>
                        <Key>example_blind.jpg</Key>
                        <Location>sunweitest-1251956900.cos.ap-beijing.myqcloud.com/example_blind.jpg</Location>
                        <Format>JPEG</Format>
                        <Width>1024</Width>
                        <Height>690</Height>
                        <Size>162849</Size>
                        <Quality>64</Quality>
                </Object>
        </ProcessResults>
</UploadResult>

//<Location>sunweitest-1251956900.cos.ap-beijing.myqcloud.com/example.jpg</Location>为上传的原图
//<Location>sunweitest-1251956900.cos.ap-beijing.myqcloud.com/example_blind.jpg</Location>为带盲水印的图片

访问原图

原始图片

访问盲水印图片

带有全盲水印的图片

两张图片并无明显差异。创建全盲水印完成

已上传的图片,我们也可以通过设置参数的方式来实现

watermark/3/type/<type>/image/<imageUrl>/text/<text>

参数说明

参数 类型 必选 描述
type Int 盲水印类型,有效值:1 半盲;2 全盲;3 文字
image String 盲水印图片地址,需要经过 URL 安全的 Base64 编码。 当 type 为1或2时必填,type 为3时无效。 指定的水印图片必须同时满足如下 3 个条件: 1. 盲水印图片与原图片必须位于同一个对象存储桶下; 2. URL 需使用数据万象源站域名(不能使用 CDN 加速、COS 源站域名),如:examplebucket-1250000000.image.myqcloud.com 属于 CDN 加速域名,不能在水印 URL 中使用; 3. URL 必须以 http:// 开始,不能省略 http 头,也不能填 https 头,如:examplebucket-1250000000.picsh.myqcloud.com/shuiyin_2.png, https://examplebucket-1250000000.picsh.myqcloud.com/shuiyin_2.png 就是非法的水印 URL。
text String 盲水印文字,需要经过 URL 安全的 Base64 编码。 当 type 为3时必填,type 为1或2时无效。

例如:http://sunweitest-1251956900.pic.ap-beijing.myqcloud.com/example.jpg?watermark/3/type/2/image/aHR0cDovL3N1bndlaXRlc3QtMTI1MTk1NjkwMC5waWNiai5teXFjbG91ZC5jb20vYmxpbmQucG5n

这种方式和添加普通水印一样。只需要在url后面加入盲水印参数即可得到处理后的盲水印图片

下一节介绍一下如何提取盲水印

文章来源于腾讯云开发者社区,点击查看原文