通過圖片盲浮水印技術,您可以在不影響原圖視覺效果的前提下,向圖片中嵌入不可見的文字資訊。使用解析盲浮水印功能,可以恢複出圖片中的浮水印資訊。盲浮水印圖片經過壓縮、縮放、裁剪、旋轉、色彩變換等攻擊後,仍然可以提取出浮水印內容。
功能簡介
圖片盲浮水印功能示範示意圖如下:
使用限制
僅支援文字浮水印,浮水印內容最多支援256個字元。
圖片格式僅支援 jpg、png、bmp、tiff 和 webp。圖片的長寬最小為 80px,最大為 10000px。
圖片盲浮水印可抵抗一定程度的攻擊,可抵抗的攻擊手段包括截屏、裁剪、JPEG壓縮、縮放、換色、飽和度變換、色調變換、亮度變換、少量塗鴉。
圖片盲浮水印不支援純黑或純白圖片,以及解析度過低(<200px * 200px,非嚴格參數)的圖片。同時,圖片的短邊與長邊的比例應大於1:2。
應用情境
鑒權追責:判斷己方的圖片資源是否被惡意攻擊方盜取。
上傳查重:判斷使用者上傳的圖片資源是否來自已存在的資產庫。
資源防泄漏:通過流傳的資源圖片中嵌入的盲浮水印得到泄漏方的相關資訊。
前提條件
已建立並擷取AccessKey。具體操作,請參見建立AccessKey。
已開通OSS服務、建立儲存空間並上傳檔案到儲存空間。具體操作,請參見控制台上傳檔案。
已開通Intelligent Media Management服務。具體操作,請參見開通產品。
已通過Intelligent Media Management控制台建立專案。具體操作,請參見建立專案。
您也可以調用API介面建立專案。具體操作,請參見CreateProject - 建立專案。
您可以調用ListProjects - 查詢所有專案資訊介面列出指定地區下已建立的所有專案資訊。
使用方法
添加圖片盲浮水印
調用EncodeBlindWatermark介面為圖片添加盲浮水印。
圖片資訊
IMM專案名稱:test-project
待檢測圖片的儲存地址:oss://test-bucket/test-object.jpg
圖片樣本:
請求樣本
{
"ProjectName": "test-project",
"SourceURI": "oss://test-bucket/test-object.jpg",
"TargetURI": "oss://test-bucket/blindwatermark-object.jpg",
"Content": "阿里雲著作權",
}
返回樣本
{
"RequestId": "4FACCDBE-6D15-4E02-9924-1CC5FAF2A9B3",
}
範例程式碼
以Python SDK為例,添加圖片盲浮水印的完整範例程式碼如下。
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import os
import sys
from typing import List
from alibabacloud_imm20200930.client import Client as imm20200930Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_imm20200930 import models as imm_20200930_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> imm20200930Client:
"""
使用AK&SK初始化帳號Client
@param access_key_id:
@param access_key_secret:
@return: Client
@throws Exception
"""
# 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考。
# 建議使用更安全的 STS 方式,更多鑒權訪問方式請參見:https://help.aliyun.com/document_detail/378659.html。
config = open_api_models.Config(
# 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。,
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
# 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
# Endpoint 請參考 https://api.aliyun.com/product/imm
config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
return imm20200930Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
client = Sample.create_client()
encode_blind_watermark_request = imm_20200930_models.EncodeBlindWatermarkRequest(
project_name='test-project',
source_uri='oss://test-bucket/test-object.jpg',
target_uri='oss://test-bucket/blindwatermark-object.jpg',
content='阿里雲著作權'
)
runtime = util_models.RuntimeOptions()
try:
# 複製代碼運行請自行列印 API 的傳回值
client.encode_blind_watermark_with_options(encode_blind_watermark_request, runtime)
except Exception as error:
# 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
# 錯誤 message
print(error.message)
# 診斷地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
@staticmethod
async def main_async(
args: List[str],
) -> None:
client = Sample.create_client()
encode_blind_watermark_request = imm_20200930_models.EncodeBlindWatermarkRequest(
project_name='test-project',
source_uri='oss://test-bucket/test-object.jpg',
target_uri='oss://test-bucket/blindwatermark-object.jpg',
content='阿里雲著作權'
)
runtime = util_models.RuntimeOptions()
try:
# 複製代碼運行請自行列印 API 的傳回值
await client.encode_blind_watermark_with_options_async(encode_blind_watermark_request, runtime)
except Exception as error:
# 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
# 錯誤 message
print(error.message)
# 診斷地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
if __name__ == '__main__':
Sample.main(sys.argv[1:])
建立解析盲浮水印任務
調用CreateDecodeBlindWatermarkTask介面建立解析盲浮水印任務,任務完成後,可通過GetDecodeBlindWatermarkResult介面或從非同步訊息中擷取盲浮水印結果。
任務開始執行後,任務資訊只儲存7天,超過7天則無法再擷取。您可以通過以下幾種方式及時擷取任務資訊:
調用GetTask - 擷取任務資訊或ListTasks - 查詢工作清單介面擷取返回的
TaskId
,查看任務資訊。在與Intelligent Media Management相同的地區下開通MNS服務,並配置訂閱關係,及時擷取任務資訊通知,非同步通知訊息格式請參見非同步通知訊息格式。關於MNS SDK的更多資訊,請參見隊列使用手冊。
在與Intelligent Media Management相同的地區下開通RocketMQ服務,並建立RocketMQ 4.0執行個體、Topic、Group,及時擷取任務資訊通知,非同步通知訊息格式請參見非同步通知訊息格式。關於RocketMQ使用的更多資訊,請參見調用HTTP協議的SDK收發普通訊息。
在與Intelligent Media Management相同的地區下開通並接入事件匯流排EventBridge服務,及時擷取任務資訊通知。更多資訊,請參見Intelligent Media ManagementIMM事件。
圖片資訊
IMM專案名稱:test-project
待檢測圖片的儲存地址:oss://test-bucket/blindwatermark-object.jpg
圖片樣本:
請求樣本
{
"ProjectName": "test-project",
"SourceURI": "oss://test-bucket/blindwatermark-object.jpg",
}
返回樣本
{
"TaskId": "DecodeBlindWatermark-23dee5ea-d890-4f82-9357-fa6ad027b2a9",
"RequestId": "79DD63F2-B72D-0E53-97AA-8B98C1758DBF",
"EventId": "073-1oOm1dJjEUrCnQz0oFqtEwO7rJr"
}
範例程式碼
以Python SDK為例,解析盲浮水印任務的完整範例程式碼如下。
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import os
import sys
from typing import List
from alibabacloud_imm20200930.client import Client as imm20200930Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_imm20200930 import models as imm_20200930_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> imm20200930Client:
"""
使用AK&SK初始化帳號Client
@param access_key_id:
@param access_key_secret:
@return: Client
@throws Exception
"""
# 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考。
# 建議使用更安全的 STS 方式,更多鑒權訪問方式請參見:https://help.aliyun.com/document_detail/378659.html。
config = open_api_models.Config(
# 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。,
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
# 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
# Endpoint 請參考 https://api.aliyun.com/product/imm
config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
return imm20200930Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
client = Sample.create_client()
create_decode_blind_watermark_task_request = imm_20200930_models.CreateDecodeBlindWatermarkTaskRequest(
project_name='test-project',
source_uri='oss://test-bucket/blindwatermark-object.jpg'
)
runtime = util_models.RuntimeOptions()
try:
# 複製代碼運行請自行列印 API 的傳回值
client.create_decode_blind_watermark_task_with_options(create_decode_blind_watermark_task_request, runtime)
except Exception as error:
# 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
# 錯誤 message
print(error.message)
# 診斷地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
@staticmethod
async def main_async(
args: List[str],
) -> None:
client = Sample.create_client()
create_decode_blind_watermark_task_request = imm_20200930_models.CreateDecodeBlindWatermarkTaskRequest(
project_name='test-project',
source_uri='oss://test-bucket/blindwatermark-object.jpg'
)
runtime = util_models.RuntimeOptions()
try:
# 複製代碼運行請自行列印 API 的傳回值
await client.create_decode_blind_watermark_task_with_options_async(create_decode_blind_watermark_task_request, runtime)
except Exception as error:
# 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
# 錯誤 message
print(error.message)
# 診斷地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
if __name__ == '__main__':
Sample.main(sys.argv[1:])