通过图片盲水印技术,您可以在不影响原图视觉效果的前提下,向图片中嵌入不可见的文字信息。如需获取水印内容,可使用解析盲水印接口获取。即使图片经过一定程度的攻击(裁剪、旋转、缩放、涂鸦、换色等),仍可以正确解析水印内容。
使用场景
鉴权追责:判断己方的图片是否被恶意攻击方盗取。
上传查重:判断用户上传的图片是否来自已存在的资源库。
资源防泄漏:通过流传的资源图片中嵌入的盲水印得到泄漏方的相关信息。
注意事项
图片盲水印只能使用当前存储空间内的图片。网络或本地图片需上传至当前存储空间内方可使用。
使用盲水印功能需要为当前存储空间绑定 IMM Project,请参见快速入门。添加盲水印后的图片需要存储到当前IMM Project对应的存储空间,否则会无法解析。
图片盲水印仅支持JPG、PNG、BMP、WebP、TIFF格式。
仅支持为图片添加文字水印。
添加盲水印为同步操作,解析盲水印为异步操作。
必须拥有IMM处理所需的相关权限。更多信息,请参见权限。
图片盲水印不支持纯黑、纯白图片,以及分辨率过低(<200px * 200px,非严格参数)的图片。
添加盲水印
参数说明
操作名称:image/blindwatermark
相关参数如下:
参数 | 是否必须 | 描述 | 取值范围 |
content | 否 | 文字水印的Base64编码。 | Base64编码之前水印字符串的最大长度限制为256个字符。 |
s | 否 | 水印添加强度,强度越高,添加水印后的图像抵抗攻击性能越强,但引起的失真越明显。 |
|
q | 否 | 携带水印信息的输出图片的存储质量。质量越高,图片尺寸越大,水印解析质量越高。 说明 仅输入图片格式为jpg时生效。 | 默认值为90,取值范围为70~100。 |
添加图片盲水印时也会用到sys/saveas
参数。更多信息,请参见另存为。
水印编码
在添加水印操作中,文字水印的文字内容等参数需要进行URL安全的Base64编码。编码步骤如下:
将内容编码成Base64。
将结果中的部分编码替换。
将结果中的加号(+)替换成短划线(-)。
将结果中的正斜线(/)替换成下划线(_)。
将结果中尾部的所有等号(=)省略。
推荐通过base64url encoder对文字水印的文字内容的水印图片名称等参数进行编码。
解析盲水印
参数说明
操作名称:image/deblindwatermark
相关参数如下:
参数 | 是否必须 | 描述 | 取值范围 |
s | 否 | 水印提取等级,等级增大,耗时越长,提取效果越好。 |
|
t | 否 | 嵌入的水印类型。 | text:文字。 |
解析盲水印时也会用到notify
参数。更多信息,请参见消息通知。
使用REST API
添加盲水印
POST /example.jpg?x-oss-process HTTP/1.1
Host: image-demo.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 28 Oct 2022 06:40:10 GMT
Authorization: OSS qn6qrrqxo2oawuk53otf****:UNQDb7GapEgJkcde6OhZ9J****
// 水印内容为“阿里云版权所有”,水印强度为low,输出图片质量为90,添加水印后的图片保存为oss://image-demo/outobjprefix.jpg
x-oss-process=image/blindwatermark,content_6Zi_6YeM5LqR54mI5p2D5omA5pyJ,s_low,q_90|sys/saveas,b_aW1hZ2UtZGVtbw,o_b3V0b2JqcHJlZml4LmpwZw
解析盲水印
POST /outobjprefix.jpg?x-oss-async-process HTTP/1.1
Host: image-demo.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 28 Oct 2022 06:40:10 GMT
Authorization: OSS qn6qrrqxo2oawuk53otf****:UNQDb7GapEgJkcde6OhZ9J****
// 解析上一步中添加的水印,消息topic为doc-images。
x-oss-async-process=image/deblindwatermark|sys/notify,topic_ZG9jLWltYWdlcw
任务完成后,从图片中解析出来的水印内容会在异步消息中返回,详见CreateDecodeBlindWatermarkTask接口MNS消息示例。
使用SDK
添加盲水印
添加盲水印为同步接口,Python SDK示例如下:
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# 指定原图所在的Bucket名称。
source_bucket_name = 'source_bucket_name'
# 指定用于存放处理后图片的Bucket名称,该Bucket需与原图所在Bucket在同一地域。
taget_bucket_name = 'taget_bucket_name'
# 指定原图名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如sourceDir/source.jpg。
source_image_name = 'sourceDir/source.jpg'
# 指定Bucket实例,所有文件相关的方法都需要通过Bucket实例来调用。
bucket = oss2.Bucket(auth, endpoint, source_bucket_name)
# 指定水印内容
content = '阿里云版权所有'
# 添加盲水印
style = "image/blindwatermark,content_{0}".format(oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(content))))
# 指定处理后图片名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如targetDir/target.jpg。
target_image_name = 'targetDir/target.jpg'
process = "{0}|sys/saveas,o_{1},b_{2}".format(style,
oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(target_image_name))),
oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(taget_bucket_name))))
result = bucket.process_object(source_image_name, process)
print(result)
其他语言使用方法请参见另存为。
解析水印
解析盲水印为异步接口,Python SDK 示例如下:
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 指定Bucket名称。
bucket_name = 'taget_bucket_name'
# 指定水印图文件名称。
source_key = 'targetDir/target.jpg'
# 指定MNS消息的topic。
topic = 'imm-blindwatermark-test'
# 指定Bucket实例,所有文件相关的方法都需要通过Bucket实例来调用。
bucket = oss2.Bucket(auth, endpoint, bucket_name)
# 提取指定图片中的水印内容。
style = 'image/deblindwatermark,s_low,t_text'
process = "{0}|sys/notify,topic_{1}".format(style,
oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(topic))).replace('=', ''))
# 调用异步流媒体处理接口。
result = bucket.async_process_object(source_key, process)
print(result.request_id)
其他语言使用方法请参见异步处理。