すべてのプロダクト
Search
ドキュメントセンター

Intelligent Media Management:不可視ウォーターマーク

最終更新日:May 20, 2025

不可視ウォーターマークとは、画像に知覚できないテキスト情報を埋め込むことができるウォーターマーク技術です。不可視ウォーターマークは、ウォーターマーク付き画像が圧縮、サイズ変更、トリミング、色変更などの一般的な画像処理操作で処理された場合でも抽出できます。

仕組み

次の図は、不可視ウォーターマークのプロセスを示しています。

image

制限事項

  • 不可視テキストウォーターマークのみがサポートされています。不可視テキストウォーターマークは、最大 256 文字まで使用できます。

  • JPG、PNG、BMP、TIFF、および WebP 画像にのみ不可視ウォーターマークを追加できます。画像の最小幅と高さは 80 ピクセルです。画像の最大幅と高さは 10,000 ピクセルです。

  • 不可視ウォーターマークは、スクリーンショット、トリミング、JPEG 圧縮、サイズ変更、色変更、彩度調整、色相調整、輝度調整、軽量な落書きの追加など、一般的な処理操作や攻撃に対して堅牢です。

  • 不可視ウォーターマークは、純白、純黒の画像、または解像度が低すぎる画像 (例: 200 × 200 ピクセル未満) をサポートしていません。短辺と長辺の比率は 1:2 より大きくなければなりません。

シナリオ

  • 所有権の証明と法的証拠: 不可視ウォーターマークは、所有権の紛争が発生した場合に所有権を証明するために使用できます。

  • アップロードの画像重複排除: 不可視ウォーターマークを使用して、アップロードする画像がリソースライブラリに既に存在するかどうかを検出できます。

  • リソースリークの防止: 画像が不正に配布された場合、不可視ウォーターマークを使用してリークの原因を追跡できるため、リソースリークの防止に役立ちます。

前提条件

  • AccessKey ペアが作成され、取得されています。詳細については、「AccessKey ペアを作成する」をご参照ください。

  • 関連オブジェクトが OSS バケットにアップロードされています。詳細については、「オブジェクトのアップロード」をご参照ください。

  • Intelligent Media Management (IMM) が有効化されています。詳細については、「IMM を有効にする」をご参照ください。

  • IMM コンソールでプロジェクトが作成されています。詳細については、「プロジェクトを作成する」をご参照ください。

説明

CreateProject 操作を呼び出してプロジェクトを作成することもできます。詳細については、「CreateProject」をご参照ください。

ListProjects 操作を呼び出して、指定したリージョン内のすべてのプロジェクトを一覧表示できます。

使用方法

不可視ウォーターマークを追加する

EncodeBlindWatermark 操作を呼び出して、画像に不可視ウォーターマークを追加します。

画像情報

  • IMM プロジェクト: test-project

  • 画像アドレス: oss://test-bucket/test-object.jpg

  • 画像:

image

リクエスト例

{
  "ProjectName": "test-project",
  "SourceURI": "oss://test-bucket/test-object.jpg",
  "TargetURI": "oss://test-bucket/blindwatermark-object.jpg",
  "Content": "All rights reserved by Alibaba Cloud", // Alibaba Cloud のすべての権利予約
}

レスポンス例

{
  "RequestId": "4FACCDBE-6D15-4E02-9924-1CC5FAF2A9B3",
}

サンプルコード

次のサンプルコードは、Python 用 IMM SDK を使用して画像に不可視ウォーターマークを追加する方法の例を示しています。

# -*- coding: utf-8 -*-
# このファイルは自動生成されています。編集しないでください。
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:
        """
        AccessKey ID と AccessKey シークレットを使用してクライアントを初期化します。
        @param access_key_id:
        @param access_key_secret:
        @return: Client
        @throws Exception
        """
        # プロジェクトコードが漏洩した場合、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。次の行は参照用にのみ提供されています。
        # セキュリティ上の理由から、セキュリティトークンサービス (STS) によって提供される一時的なアクセス認証情報を使用することをお勧めします。詳細については、https://www.alibabacloud.com/help/ja/sdk/developer-reference/v2-manage-php-access-credentials を参照してください。
        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']
        )
        # IMM エンドポイントを指定します。サポートされているリージョンの IMM エンドポイントの一覧については、https://api.alibabacloud.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='All rights reserved by Alibaba Cloud' // Alibaba Cloud のすべての権利予約
        )
        runtime = util_models.RuntimeOptions()
        try:
            # 必要に応じて、API 操作のレスポンスを出力します。
            client.encode_blind_watermark_with_options(encode_blind_watermark_request, runtime)
        except Exception as error:
            # 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトで例外を無視しないでください。この例では、エラーメッセージが画面に出力されます。
            # エラーメッセージを表示します。
            print(error.message)
            # トラブルシューティング用の URL を表示します。
            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='All rights reserved by Alibaba Cloud' // Alibaba Cloud のすべての権利予約
        )
        runtime = util_models.RuntimeOptions()
        try:
            # 必要に応じて、API 操作のレスポンスを出力します。
            await client.encode_blind_watermark_with_options_async(encode_blind_watermark_request, runtime)
        except Exception as error:
            # 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトで例外を無視しないでください。この例では、エラーメッセージが画面に出力されます。
            # エラーメッセージを表示します。
            print(error.message)
            # トラブルシューティング用の URL を表示します。
            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 操作を呼び出します。

  • IMM プロジェクトが配置されているリージョンで、Simple Message Queue (SMQ) サブスクリプションを構成して、タスク情報通知を受信します。非同期通知形式については、「非同期メッセージの例」をご参照ください。 SMQ SDK の詳細については、「手順 4: メッセージを受信して削除する」をご参照ください。

  • IMM プロジェクトが配置されているリージョンで、ApsaraMQ for RocketMQ 4.0 インスタンス、トピック、およびグループを作成して、タスク通知を受信します。非同期通知形式については、「非同期メッセージの例」をご参照ください。 ApsaraMQ for RocketMQ の使用方法の詳細については、「HTTP クライアント SDK を使用して通常のメッセージを送受信する」をご参照ください。

  • IMM プロジェクトが配置されているリージョンで、EventBridge を使用してタスク情報通知を受信します。詳細については、「IMM イベント」をご参照ください。

画像情報

  • IMM プロジェクト: test-project

  • 画像の場所: oss://test-bucket/blindwatermark-object.jpg

  • 画像:

image

リクエスト例

{
  "ProjectName": "test-project",
  "SourceURI": "oss://test-bucket/blindwatermark-object.jpg", // ウォーターマーク付きオブジェクトの OSS パス
}

レスポンス例

{
  "TaskId": "DecodeBlindWatermark-23dee5ea-d890-4f82-9357-fa6ad027b2a9",
  "RequestId": "79DD63F2-B72D-0E53-97AA-8B98C1758DBF",
  "EventId": "073-1oOm1dJjEUrCnQz0oFqtEwO7rJr"
}

サンプルコード

次のサンプルコードは、Python 用 IMM SDK を使用して不可視ウォーターマークをデコードする方法の例を示しています。

# -*- coding: utf-8 -*-
# このファイルは自動生成されています。編集しないでください。
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:
        """
        AccessKey ID と AccessKey シークレットを使用してクライアントを初期化します。
        @param access_key_id:
        @param access_key_secret:
        @return: Client
        @throws Exception
        """
        # プロジェクトコードが漏洩した場合、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。次の行は参照用にのみ提供されています。
        # セキュリティ上の理由から、セキュリティトークンサービス (STS) によって提供される一時的なアクセス認証情報を使用することをお勧めします。詳細については、https://www.alibabacloud.com/help/ja/sdk/developer-reference/v2-manage-php-access-credentials を参照してください。
        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']
        )
        # IMM エンドポイントを指定します。サポートされているリージョンの IMM エンドポイントの一覧については、https://api.alibabacloud.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' // ウォーターマーク付きオブジェクトの OSS パス
        )
        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:
            # 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトで例外を無視しないでください。この例では、エラーメッセージが画面に出力されます。
            # エラーメッセージを表示します。
            print(error.message)
            # トラブルシューティング用の URL を表示します。
            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' // ウォーターマーク付きオブジェクトの OSS パス
        )
        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:
            # 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトで例外を無視しないでください。この例では、エラーメッセージが画面に出力されます。
            # エラーメッセージを表示します。
            print(error.message)
            # トラブルシューティング用の URL を表示します。
            print(error.data.get("Recommend"))
            UtilClient.assert_as_string(error.message)


if __name__ == '__main__':
    Sample.main(sys.argv[1:])