数据万象盲水印操作实践--提取盲水印
上一节我们讲述了如何添加盲水印,以及访问时实时生成盲水印图片。
本节我们做一下如何从图片中提取盲水印。可用于水印的提取,识别判断等业务逻辑。
请求语法
提取盲水印的请求包与 COS 简单上传文件接口一致,只需在请求包头部增加图片处理参数 Pic-Operations 并使用提取盲水印参数(watermark/4)即可。相关示例如下:
PUT /<ObjectKey> HTTP/1.1
Host: <BucketName-APPID>.pic.<Region>.myqcloud.com
Date: GMT Date
Authorization:XXXXXXXXXXXX
Pic-Operations: <PicOperations>
请求内容
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/4/type/<type>/image/<imageUrl>/text/<text>
参数说明
参数 |
类型 |
必选 |
描述 |
---|---|---|---|
type |
Int |
是 |
盲水印类型,有效值:1 半盲;2 全盲;3 文字,必须跟添加盲水印时的 type 类型一致 |
image |
String |
否 |
图片地址,当type为1或2时必填,type为3时无效。 type 为1时,为原图图片地址;type 为2时,为水印图地址; 需要经过 URL 安全的 Base64 编码。指定的图片必须同时满足如下 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。 |
返回内容
返回内容中的 UploadResult——ProcessResults——Object 字段中新增 WatermarkStatus 字段,当盲水印提取的请求包中 type 参数为2时携带该参数,其他情况不返回该参数。
参数 |
类型 |
父节点 |
描述 |
---|---|---|---|
WatermarkStatus |
Int |
Object |
当 type 为2时返回该字段,表示提取到全盲水印的可信度。具体为0-100的数字,75分以上表示确定有盲水印,60-75表示疑似有盲水印,60以下可认为未提取到盲水印 |
代码片段:
//构造http请求的对象
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 = "i47aA.D.e51/https://kz.cx/wp-content/uploads/2023/01/20230108225903-63bada3768bab.png";
//盲水印提取
myRequest.Headers.Add("Pic-Operations", "{\\"is_pic_info\\":1,\\"rules\\":[{\\"fileid\\":\\"example2.jpg\\",\\"rule\\":\\"watermark/4/type/2/image/" + EncodeBase64(watermarkurl) + "\\"}]}");
outstream = myRequest.GetRequestStream();
outstream.Flush();
outstream.Write(buf, 0, buf.Length);
outstream.Flush();
outstream.Close();
// 获得接口返回值
myResponse = (HttpWebResponse)myRequest.GetResponse();
reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
string ReturnXml = reader.ReadToEnd();
reader.Close();
myResponse.Close();
myRequest.Abort();
注意fi这里需要是一个含有盲水印的图片,才可以得到提取值,测试一下。
我们用未含有盲水印的原图提取一下。
<UploadResult>
<OriginalInfo>
<Key>example.jpg</Key>
<Location>sunweitest-1251956900.cos.ap-beijing.myqcloud.com/example.jpg</Location>
<ImageInfo>
<Format>JPEG</Format>
<Width>960</Width>
<Height>1280</Height>
<Quality>78</Quality>
<Ave>0x5a5a3d</Ave>
<Orientation>1</Orientation>
</ImageInfo>
</OriginalInfo>
<ProcessResults>
<Object>
<Key>example2.jpg</Key>
<Location>sunweitest-1251956900.cos.ap-beijing.myqcloud.com/example2.jpg</Location>
<Format>JPEG</Format>
<Width>119</Width>
<Height>82</Height>
<Size>5891</Size>
<Quality>78</Quality>
<WatermarkStatus>54</WatermarkStatus>
</Object>
</ProcessResults>
</UploadResult>
得到WatermarkStatus为54,判断未含有盲水印,提取失败。提取的结果图片为
我们用含有盲水印的图片提取
<UploadResult>
<OriginalInfo>
<Key>example.jpg</Key>
<Location>sunweitest-1251956900.cos.ap-beijing.myqcloud.com/example.jpg</Location>
<ImageInfo>
<Format>JPEG</Format>
<Width>960</Width>
<Height>1280</Height>
<Quality>78</Quality>
<Ave>0x5a5a3d</Ave>
<Orientation>1</Orientation>
</ImageInfo>
</OriginalInfo>
<ProcessResults>
<Object>
<Key>example2.jpg</Key>
<Location>sunweitest-1251956900.cos.ap-beijing.myqcloud.com/example2.jpg</Location>
<Format>JPEG</Format>
<Width>119</Width>
<Height>82</Height>
<Size>6938</Size>
<Quality>78</Quality>
<WatermarkStatus>77</WatermarkStatus>
</Object>
</ProcessResults>
</UploadResult>
看到WatermarkStatus为77,提取成功。提取的图片为
和水印图片比较一下。似曾相识......
以上就是数据万象-盲水印的操作方法。附件中是本次实践的代码(C#版)欢迎大家亲自实践感受一下,同时也希望继续支持腾讯云-数据万象产品。