图片盲水印

对于存储在Bucket中的图片,您可以使用图片盲水印功能, 支持为图片添加文字盲水印和解析盲水印。

功能简介

通过图片盲水印技术,您可以在不影响原图视觉效果的前提下,向图片中嵌入不可见的文字信息。如需获取水印内容,可使用解析盲水印接口获取。即使图片经过一定程度的攻击(裁剪、旋转、缩放、涂鸦、换色等),仍可以正确解析水印内容。

image

使用场景

  • 鉴权追责:判断己方的图片是否被恶意攻击者盗取。

  • 上传查重:判断用户上传的图片是否来自已存在的资源库。

  • 资源防泄漏:通过流传的资源图片中嵌入的盲水印得到泄漏方的相关信息。

前提条件

  • 已开通智能媒体管理(IMM)服务。具体操作,请参见开通产品

  • 已绑定IMM项目。通过OSS控制台绑定的具体操作,请参见快速入门。通过API绑定的具体操作,请参见AttachOSSBucket

注意事项

  • 图片盲水印仅支持JPG、PNG、BMP、WebP、TIFF格式。

  • 图片盲水印不支持纯黑、纯白图片,以及分辨率过低(<200px * 200px,非严格参数)的图片。

  • 仅支持为图片添加文字水印。

  • 添加盲水印为同步处理(x-oss-process)方式,解析盲水印为异步处理(x-oss-async-process)方式。

参数说明

添加盲水印

操作名称:image/blindwatermark

参数

是否必须

描述

取值范围

content

文字水印的Base64编码。

Base64编码之前水印字符串的最大长度限制为256个字符。

s

水印添加强度,强度越高,添加水印后的图像抵抗攻击性能越强,但引起的失真越明显。

  • low(默认值):低强度。

  • medium:中等强度。

  • high:高强度。

q

携带水印信息的输出图片的存储质量。质量越高,图片尺寸越大,水印解析质量越高。

说明

仅输入图片格式为jpg时生效。

默认值为90,取值范围为70~100。

添加图片盲水印时也会用到sys/saveas参数。更多信息,请参见另存为

解析盲水印

操作名称:image/deblindwatermark

参数

是否必须

描述

取值范围

s

水印提取等级,等级增大,耗时越长,提取效果越好。

  • low(默认值):低等级。

  • medium:中等级。

  • high:高等级。

t

嵌入的水印类型。

text:文字。

解析盲水印时也会用到notify参数。更多信息,请参见消息通知

水印编码步骤

  1. 将内容编码成Base64。

  2. 将结果中的部分编码替换。

    • 将结果中的加号(+)替换成短划线(-)。

    • 将结果中的正斜线(/)替换成下划线(_)。

    • 将结果中尾部的所有等号(=)省略。

使用示例

添加盲水印

操作名称:image/blindwatermark

推荐通过base64url encoder对文字水印的内容等参数进行编码。

使用阿里云SDK

以下仅列举常见SDK添加图片盲水印的代码示例。如需使用其他SDK添加图片盲水印的代码示例,请参见SDK简介

Java

要求使用3.17.4及以上版本的Java SDK。

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.GenericResult;
import com.aliyun.oss.model.ProcessObjectRequest;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Formatter;

public class Demo {
    public static void main(String[] args) throws IOException {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";

        // 强烈建议不要把访问凭证保存到工程代码里,否则可能导致访问凭证泄露,威胁您账号下所有资源的安全。
        // 本代码示例以从环境变量中获取访问凭证为例。运行本代码示例之前,请先配置环境变量。
        EnvironmentVariableCredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();

        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";

        // 指定原图名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如sourceDir/source.jpg
        String sourceImage = "sourceDir/source.jpg";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            StringBuilder sbStyle = new StringBuilder();
            Formatter styleFormatter = new Formatter(sbStyle);

            // 指定水印内容
            String content = "阿里云版权所有";
            // 添加盲水印
            byte[] encodedContentBytes = java.util.Base64.getEncoder().encode(content.getBytes(StandardCharsets.UTF_8));
            String encodedContentStr = new String(encodedContentBytes, StandardCharsets.UTF_8);
            String styleType = "image/blindwatermark,content_" + encodedContentStr;

            // 指定处理后图片名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如targetDir/target.jpg。
            String targetImage = "targetDir/target.jpg";
            styleFormatter.format("%s|sys/saveas,o_%s,b_%s",
                    styleType,
                    java.util.Base64.getEncoder().encodeToString(targetImage.getBytes(StandardCharsets.UTF_8)),
                    java.util.Base64.getEncoder().encodeToString(bucketName.getBytes(StandardCharsets.UTF_8)));

            System.out.println(sbStyle.toString());
            ProcessObjectRequest request = new ProcessObjectRequest(bucketName, sourceImage, sbStyle.toString());
            GenericResult processResult = ossClient.processObject(request);

            BufferedReader reader = new BufferedReader(new InputStreamReader(processResult.getResponse().getContent(), StandardCharsets.UTF_8));
            StringBuilder responseContent = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                responseContent.append(line).append("\n");
            }

            reader.close();
            processResult.getResponse().getContent().close();
            System.out.println(responseContent.toString());
        } catch (OSSException oe) {
            System.err.println("Caught an OSSException, which means your request made it to OSS, but was rejected with an error response for some reason.");
            System.err.println("Error Message:" + oe.getErrorMessage());
            System.err.println("Error Code:" + oe.getErrorCode());
            System.err.println("Request ID:" + oe.getRequestId());
            System.err.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.err.println("Caught an ClientException, which means the client encountered a serious internal problem while trying to communicate with OSS, such as not being able to access the network.");
            System.err.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Python

要求使用Python SDK 2.18.4及以上版本。

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.GenericResult;
import com.aliyun.oss.model.ProcessObjectRequest;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Demo {
    public static void main(String[] args) throws IOException {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        
        // 强烈建议不要把访问凭证保存到工程代码里,否则可能导致访问凭证泄露,威胁您账号下所有资源的安全。
        // 本代码示例以从环境变量中获取访问凭证为例。运行本代码示例之前,请先配置环境变量。
        EnvironmentVariableCredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();

        // 填写Bucket名称,例如examplebucket。
        String bucketName = "your-bucket-name";

        // 指定原图名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如sourceDir/source.jpg
        String sourceImage = "sourceDir/source.jpg";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // 指定水印内容
            String content = "阿里云版权所有";
            byte[] encodedContentBytes = Base64.getUrlEncoder().withoutPadding().encode(content.getBytes(StandardCharsets.UTF_8));
            String encodedContentStr = new String(encodedContentBytes, StandardCharsets.UTF_8);
            String style = "image/blindwatermark,content_" + encodedContentStr;

            // 指定处理后图片名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如targetDir/target.jpg。
            String targetImage = "targetDir/target.jpg";
            String encodedTargetImageStr = Base64.getUrlEncoder().withoutPadding().encodeToString(targetImage.getBytes(StandardCharsets.UTF_8));
            String bucketNameEncoded = Base64.getUrlEncoder().withoutPadding().encodeToString(bucketName.getBytes(StandardCharsets.UTF_8));

            StringBuilder sbStyle = new StringBuilder();
            sbStyle.append(style)
                   .append("|")
                   .append("sys/saveas")
                   .append(",o_").append(encodedTargetImageStr)
                   .append(",b_").append(bucketNameEncoded);

            System.out.println(sbStyle.toString());
            ProcessObjectRequest request = new ProcessObjectRequest(bucketName, sourceImage, sbStyle.toString());
            GenericResult processResult = ossClient.processObject(request);
            
            BufferedReader reader = new BufferedReader(new InputStreamReader(processResult.getResponse().getContent(), StandardCharsets.UTF_8));
            StringBuilder responseContent = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                responseContent.append(line).append("\n");
            }
            
            reader.close();
            processResult.getResponse().getContent().close();
            System.out.println(responseContent.toString());
        } catch (OSSException oe) {
            System.err.println("Caught an OSSException, which means your request made it to OSS, but was rejected with an error response for some reason.");
            System.err.println("Error Message:" + oe.getErrorMessage());
            System.err.println("Error Code:" + oe.getErrorCode());
            System.err.println("Request ID:" + oe.getRequestId());
            System.err.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.err.println("Caught an ClientException, which means the client encountered a serious internal problem while trying to communicate with OSS, such as not being able to access the network.");
            System.err.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Go

要求使用Go SDK 3.0.2及以上版本。

package main

import (
	"encoding/base64"
	"fmt"
	"os"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 指定原图所在Bucket的名称。
	bucketName := "srcbucket"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		handleError(err)
		return
	}

	// 指定原图名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如sourceDir/source.jpg。
	sourceImageName := "sourceDir/source.jpg"

	// 指定用于存放处理后图片的Bucket名称,该Bucket需与原图所在Bucket在同一地域。
	targetBucketName := "destbucket"

	// 指定处理后图片名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如targetDir/target.jpg。
	targetImageName := "targetDir/target.jpg"

	// 指定水印内容
	content := "阿里云版权所有"

	// 生成图片盲水印
	encodedContent := base64.URLEncoding.EncodeToString([]byte(content))
	style := fmt.Sprintf("image/blindwatermark,content_%s", encodedContent)

	process := fmt.Sprintf("%s|sys/saveas,o_%s,b_%s", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)), base64.URLEncoding.EncodeToString([]byte(targetBucketName)))

	result, err := bucket.ProcessObject(sourceImageName, process)
	if err != nil {
		handleError(err)
	} else {
		fmt.Println(result)
	}
}

func handleError(err error) {
	fmt.Println("Error:", err)
	os.Exit(-1)
}

PHP

要求使用PHP SDK 2.7.0及以上版本。

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;

// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");

// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";

// 填写Bucket名称,例如examplebucket。
$bucket = "examplebucket";

// 指定原图名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如sourceDir/source.jpg。
$object = "sourceDir/source.jpg";

// 指定处理后图片名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如targetDir/target.jpg。
$save_object = "targetDir/target.jpg";

function base64url_encode($data)
{
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

try {
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);

    // 如果目标图片不在指定Bucket中,需上传图片到目标Bucket。
    // $ossClient->uploadFile($bucket, $object, "D:\\localpath\\exampleobject.jpg");

    $content = "阿里云版权所有";
    // 图片盲水印
    $encodedContent = base64url_encode($content);
    $style = "image/blindwatermark,content_$encodedContent";

    $process = $style .
               '|sys/saveas,' .
               'o_' . base64url_encode($save_object) .
               ',b_' . base64url_encode($bucket);

    // 将处理后的图片命名称为example-new.png并保存到当前Bucket。
    $result = $ossClient->processObject($bucket, $object, $process);
    // 打印处理结果。
    print_r($result);
} catch (OssException $e) {
    echo "Error: " . $e->getMessage();
}
?>

其他语言使用方法请参见另存为

使用REST API

如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。关于公共请求头Authorization的计算方法请参见签名版本4(推荐)

您可以通过在PostObject接口中添加x-oss-process参数的方式来处理图片。更多信息请参见PostObject

处理示例

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: AuthorizationValue

// 水印内容为“阿里云版权所有”,水印强度为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

解析盲水印

操作名称:image/deblindwatermark

使用阿里云SDK

以下仅列举常见SDK解析图片盲水印的代码示例。如需使用其他SDK解析图片盲水印的代码示例,请参见SDK简介

Java

要求使用3.17.4及以上版本的Java SDK。

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.AsyncProcessObjectRequest;
import com.aliyun.oss.model.GenericResult;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Demo {
    public static void main(String[] args) throws IOException {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";

        // 强烈建议不要把访问凭证保存到工程代码里,否则可能导致访问凭证泄露,威胁您账号下所有资源的安全。
        // 本代码示例以从环境变量中获取访问凭证为例。运行本代码示例之前,请先配置环境变量。
        EnvironmentVariableCredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();

        // 填写Bucket名称,例如examplebucket。
        String bucketName = "target_bucket_name";

        // 指定原图名称。如果图片不在Bucket根目录,需携带文件完整访问路径,例如sourceDir/source.jpg
        String sourceKey = "targetDir/target.jpg";

        // MNS消息的主题
        String topic = "imm-blindwatermark-test";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // 提取指定图片中的水印内容
            String style = "image/deblindwatermark,s_low,t_text";
            String encodedTopic = Base64.getUrlEncoder().withoutPadding().encodeToString(topic.getBytes(StandardCharsets.UTF_8));
            String process = String.format("%s|sys/notify,topic_%s", style, encodedTopic);

            AsyncProcessObjectRequest request = new AsyncProcessObjectRequest(bucketName, sourceKey, process);
            
            // 调用异步流媒体处理接口
            GenericResult result = ossClient.asyncProcessObject(request);
            System.out.println(result.getRequestId());

        } catch (OSSException oe) {
            System.err.println("Caught an OSSException, which means your request made it to OSS, but was rejected with an error response for some reason.");
            System.err.println("Error Message:" + oe.getErrorMessage());
            System.err.println("Error Code:" + oe.getErrorCode());
            System.err.println("Request ID:" + oe.getRequestId());
            System.err.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.err.println("Caught an ClientException, which means the client encountered a serious internal problem while trying to communicate with OSS, such as not being able to access the network.");
            System.err.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Python

要求使用Python SDK 2.18.4及以上版本。

# -*- 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)

Go

要求使用Go SDK 3.0.2及以上版本。

package main

import (
    "encoding/base64"
    "fmt"
    "os"
    "strings"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 创建OSSClient实例。
    endpoint := "https://oss-cn-hangzhou.aliyuncs.com"
    client, err := oss.New(endpoint, "", "", oss.WithCredentialsProvider(provider))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 指定Bucket名称。
    bucketName := "target_bucket_name" 
    bucket, err := client.Bucket(bucketName)
    if err != nil {
        handleError(err)
        return
    }

    // 指定水印图文件名称。
    sourceKey := "targetDir/target.jpg"

    // 指定MNS消息的topic。
    topic := "imm-blindwatermark-test"

    // 提取指定图片中的水印内容。
    style := "image/deblindwatermark,s_low,t_text"
    encodedTopic := strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(topic)), "=")
    process := fmt.Sprintf("%s|sys/notify,topic_%s", style, encodedTopic)

    // 调用异步流媒体处理接口。
    result, err := bucket.AsyncProcessObject(sourceKey, process)
    if err != nil {
        handleError(err)
    } else {
        fmt.Println(result.RequestID)
    }
}

func handleError(err error) {
    fmt.Fprintf(os.Stderr, "Error: %v\n", err)
    os.Exit(-1)
}

PHP

要求使用PHP SDK 2.7.0及以上版本。

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;

// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");

// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
$endpoint = 'https://oss-cn-hangzhou.aliyuncs.com';

// 指定Bucket名称。
$bucketName = 'target_bucket_name'; // 注意这里的拼写错误,应该是 'target_bucket_name' 而不是 'taget_bucket_name'

// 指定水印图文件名称。
$sourceKey = 'targetDir/target.jpg';

function base64_url_encode($input) {
    return strtr(base64_encode($input), '+/', '-_');
}

try {
    // 创建OSSClient实例。
    $client = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

    // 指定MNS消息的topic。
    $topic = 'imm-blindwatermark-test';

    // 提取指定图片中的水印内容。
    $style = 'image/deblindwatermark,s_low,t_text';
    $encodedTopic = str_replace('=', '', base64_url_encode($topic));
    $process = sprintf('%s|sys/notify,topic_%s', $style, $encodedTopic);

    // 调用异步流媒体处理接口。
    $result = $client->asyncProcessObject($bucketName, $sourceKey, $process);
    echo "Request ID: " . $result['request_id'] . "\n";
} catch (OssException $e) {
    echo "Error: " . $e->getMessage() . "\n";
}
?>

其他语言使用方法请参见异步处理

使用REST API

如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。关于公共请求头Authorization的计算方法请参见签名版本4(推荐)

您可以通过在PostObject接口中添加图片缩放参数的方式来处理图片。更多信息请参见PostObject

处理示例

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: AuthorizationValue

// 解析上一步中添加的水印,消息topic为doc-images。
x-oss-async-process=image/deblindwatermark|sys/notify,topic_ZG9jLWltYWdlcw