Todos os produtos
Search
Central de documentação

Object Storage Service:Marca d'água cega

Última atualização: Jul 03, 2026

Para imagens armazenadas em um bucket do Object Storage Service (OSS), você pode usar o recurso de marca d'água cega para adicionar e analisar marcas d'água de texto invisíveis.

Visão geral

Com a marca d'água cega, você pode incorporar informações de texto invisíveis em uma imagem sem afetar sua qualidade visual. Para recuperar o conteúdo da marca d'água, você pode usar a operação de análise de marca d'água cega. O conteúdo da marca d'água pode ser analisado corretamente mesmo que a imagem seja submetida a um certo grau de ataques, como recorte, redimensionamento, rabiscos ou troca de cores.

Cenários

  • Autenticação e responsabilização: Determine se suas imagens foram roubadas por invasores maliciosos.

  • Verificação de upload duplicado: Determine se uma imagem carregada já existe em uma biblioteca de recursos.

  • Prevenção de vazamento de recursos: Obtenha informações sobre a origem de um vazamento a partir da marca d'água cega incorporada em uma imagem distribuída.

Como usar

  • Adicionar uma marca d'água cega: Use o método de processamento síncrono (x-oss-process). Após a adição da marca d'água, a imagem é salva como um novo arquivo.

  • Analisar uma marca d'água cega: Use o método de processamento assíncrono (x-oss-async-process). A marca d'água de texto analisada está incluída na mensagem assíncrona.

Pré-requisitos

  • O serviço Intelligent Media Management (IMM) está ativado.

  • Um projeto IMM é criado e vinculado. Para obter mais informações sobre como vincular um projeto no console do OSS, consulte Início Rápido. Para obter mais informações sobre como vincular um projeto usando uma API, consulte AttachOSSBucket.

  • Ao analisar uma marca d'água cega, o bucket que contém a imagem deve estar na mesma região que o bucket usado quando a marca d'água foi adicionada. O bucket também deve estar vinculado ao mesmo projeto IMM usado para adicionar a marca d'água. Caso contrário, a marca d'água não poderá ser analisada.

Adicionar uma marca d'água cega

Ação: image/blindwatermark

Etapas de codificação da marca d'água

  1. Codifique o conteúdo em Base64.

  2. Você pode substituir partes da codificação no resultado.

    • Substitua sinais de mais (+) por hifens (-).

    • Substitua barras (/) por sublinhados (_).

    • Omita todos os sinais de igual (=) do final da string.

Java

É necessário o SDK para Java 3.17.4 ou posterior.

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
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 {
        // Neste exemplo, o endpoint está definido como China (Hangzhou). Defina o endpoint para a região real.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Especifique o ID da região que corresponde ao endpoint. Por exemplo, se o endpoint for oss-cn-hangzhou.aliyuncs.com, defina a região como cn-hangzhou.
        String region = "cn-hangzhou";
        // Não codifique as credenciais de acesso diretamente no seu projeto. Caso contrário, as credenciais de acesso podem ser vazadas, comprometendo a segurança de todos os seus recursos.
        // Neste exemplo, as credenciais de acesso são obtidas de variáveis de ambiente. Antes de executar o código de exemplo, configure as variáveis de ambiente.
        EnvironmentVariableCredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();

        // Especifique o nome do bucket. Exemplo: examplebucket.
        String bucketName = "examplebucket";

        // Especifique o nome da imagem de origem. Se a imagem não estiver no diretório raiz do bucket, você deve especificar o caminho completo da imagem. Exemplo: sourceDir/source.jpg.
        String sourceImage = "sourceDir/source.jpg";

        // Crie uma instância do OSSClient.
        // Quando a instância do OSSClient não for mais usada, chame o método shutdown para liberar os recursos.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Declare explicitamente o uso do algoritmo de assinatura V4.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

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

            // Especifique o conteúdo da marca d'água.
            String content = "Copyright © Alibaba Cloud";
            // Adicione uma marca d'água cega.
            // Correção: Use codificação Base64 segura para URL e remova o preenchimento.
            String encodedContentStr = java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(content.getBytes(StandardCharsets.UTF_8));
            String styleType = "image/blindwatermark,content_" + encodedContentStr;

            // Especifique o nome da imagem processada. Se a imagem não estiver no diretório raiz do bucket, você deve especificar o caminho completo da imagem. Exemplo: targetDir/target.jpg.
            String targetImage = "targetDir/target.jpg";
            // Correção: Use codificação Base64 segura para URL e remova o preenchimento para targetImage e bucketName.
            styleFormatter.format("%s|sys/saveas,o_%s,b_%s",
                    styleType,
                    java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(targetImage.getBytes(StandardCharsets.UTF_8)),
                    java.util.Base64.getUrlEncoder().withoutPadding().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("Capturada uma OSSException, o que significa que sua solicitação chegou ao OSS, mas foi rejeitada com uma resposta de erro por algum motivo.");
            System.err.println("Mensagem de Erro:" + oe.getErrorMessage());
            System.err.println("Código de Erro:" + oe.getErrorCode());
            System.err.println("ID da Solicitação:" + oe.getRequestId());
            System.err.println("ID do Host:" + oe.getHostId());
        } catch (ClientException ce) {
            System.err.println("Capturada uma ClientException, o que significa que o cliente encontrou um problema interno grave ao tentar se comunicar com o OSS, como não conseguir acessar a rede.");
            System.err.println("Mensagem de Erro:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Python

É necessário o SDK para Python 2.18.4 ou posterior.

# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# Obtenha credenciais de acesso de variáveis de ambiente. Antes de executar o código de exemplo, certifique-se de que as variáveis de ambiente OSS_ACCESS_KEY_ID e OSS_ACCESS_KEY_SECRET estão configuradas.
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Especifique o endpoint da região onde o bucket está localizado. Por exemplo, se o bucket estiver na região China (Hangzhou), defina o endpoint como https://oss-cn-hangzhou.aliyuncs.com.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Especifique o nome do bucket onde a imagem de origem está armazenada.
source_bucket_name = 'source_bucket_name'
# Especifique o nome do bucket onde você deseja armazenar a imagem processada. Este bucket deve estar na mesma região que o bucket de origem.
target_bucket_name = 'target_bucket_name'
# Especifique o nome da imagem de origem. Se a imagem não estiver no diretório raiz do bucket, você deve especificar o caminho completo da imagem. Exemplo: sourceDir/source.jpg.
source_image_name = 'sourceDir/source.jpg'

# Crie uma instância de bucket. Todos os métodos relacionados a arquivos devem ser chamados na instância do bucket.
bucket = oss2.Bucket(auth, endpoint, source_bucket_name)

# Especifique o conteúdo da marca d'água.
content = 'Copyright © Alibaba Cloud'

# Adicione uma marca d'água cega.
style = "image/blindwatermark,content_{0}".format(oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(content))))

# Especifique o nome da imagem processada. Se a imagem não estiver no diretório raiz do bucket, você deve especificar o caminho completo da imagem. Exemplo: 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(target_bucket_name))))
result = bucket.process_object(source_image_name, process)
print(result)

Go

É necessário o SDK para Go 3.0.2 ou posterior.

package main

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

func main() {
	// Obtenha credenciais de acesso de variáveis de ambiente. Antes de executar o código de exemplo, certifique-se de que as variáveis de ambiente OSS_ACCESS_KEY_ID e OSS_ACCESS_KEY_SECRET estão configuradas.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Erro:", err)
		os.Exit(-1)
	}

	// Crie uma instância do OSSClient.
	// Defina yourEndpoint como o endpoint do bucket. Neste exemplo, o endpoint de um bucket na região China (Hangzhou) é usado. Defina o endpoint para o endpoint real.
	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Erro:", err)
		os.Exit(-1)
	}

	// Especifique o nome do bucket onde a imagem de origem está armazenada.
	bucketName := "srcbucket"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		handleError(err)
		return
	}

	// Especifique o nome da imagem de origem. Se a imagem não estiver no diretório raiz do bucket, você deve especificar o caminho completo da imagem. Exemplo: sourceDir/source.jpg.
	sourceImageName := "sourceDir/source.jpg"

	// Especifique o nome do bucket onde você deseja armazenar a imagem processada. Este bucket deve estar na mesma região que o bucket de origem.
	targetBucketName := "destbucket"

	// Especifique o nome da imagem processada. Se a imagem não estiver no diretório raiz do bucket, você deve especificar o caminho completo da imagem. Exemplo: targetDir/target.jpg.
	targetImageName := "targetDir/target.jpg"

	// Especifique o conteúdo da marca d'água.
	content := "Copyright © Alibaba Cloud"

	// Gere uma marca d'água cega. Conforme exigido pela documentação, você deve remover os sinais de igual (=) finais.
	encodedContent := strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(content)), "=")
	style := fmt.Sprintf("image/blindwatermark,content_%s", encodedContent)
	// Você também deve remover os sinais de igual (=) finais do nome da imagem codificada e do nome do bucket.
	encodedImageName := strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(targetImageName)), "=")
	encodedBucketName := strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(targetBucketName)), "=")
	process := fmt.Sprintf("%s|sys/saveas,o_%s,b_%s", style, encodedImageName, encodedBucketName)

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

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

PHP

É necessário o SDK para PHP 2.7.0 ou posterior.

<?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;

// Obtenha credenciais de acesso de variáveis de ambiente. Antes de executar o código de exemplo, certifique-se de que as variáveis de ambiente OSS_ACCESS_KEY_ID e OSS_ACCESS_KEY_SECRET estão configuradas.
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");

// Defina yourEndpoint como o endpoint do bucket. Por exemplo, se o bucket estiver na região China (Hangzhou), defina o endpoint como https://oss-cn-hangzhou.aliyuncs.com.
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";

// Especifique o nome do bucket. Exemplo: examplebucket.
$bucket = "examplebucket";

// Especifique o nome da imagem de origem. Se a imagem não estiver no diretório raiz do bucket, você deve especificar o caminho completo da imagem. Exemplo: sourceDir/source.jpg.
$object = "sourceDir/source.jpg";

// Especifique o nome da imagem processada. Se a imagem não estiver no diretório raiz do bucket, você deve especificar o caminho completo da imagem. Exemplo: 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);

    // Se a imagem de destino não estiver no bucket especificado, envie a imagem para o bucket de destino.
    // $ossClient->uploadFile($bucket, $object, "D:\\localpath\\exampleobject.jpg");

    $content = "Copyright © Alibaba Cloud";
    // Adicione uma marca d'água cega à imagem.
    $encodedContent = base64url_encode($content);
    $style = "image/blindwatermark,content_$encodedContent";

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

    // Nomeie a imagem processada como example-new.png e salve-a no bucket atual.
    $result = $ossClient->processObject($bucket, $object, $process);
    // Imprima o resultado do processamento.
    print_r($result);
} catch (OssException $e) {
    echo "Erro: " . $e->getMessage();
}
?>

Para obter mais informações sobre o uso de outras linguagens, consulte Salvar Como.

Analisar uma marca d'água cega

Ação: image/deblindwatermark

Java

É necessário o SDK para Java 3.17.4 ou posterior.

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.AsyncProcessObjectRequest;
import com.aliyun.oss.model.AsyncProcessObjectResult;

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

public class Demo {
    public static void main(String[] args) throws IOException {
        // Neste exemplo, o endpoint está definido como China (Hangzhou). Defina o endpoint para a região real.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Especifique o ID da região que corresponde ao endpoint. Por exemplo, se o endpoint for oss-cn-hangzhou.aliyuncs.com, defina a região como cn-hangzhou.
        String region = "cn-hangzhou";
        // Não codifique as credenciais de acesso diretamente no seu projeto. Caso contrário, as credenciais de acesso podem ser vazadas, comprometendo a segurança de todos os seus recursos.
        // Neste exemplo, as credenciais de acesso são obtidas de variáveis de ambiente. Antes de executar o código de exemplo, configure as variáveis de ambiente.
        EnvironmentVariableCredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();

        // Especifique o nome do bucket. Exemplo: examplebucket.
        String bucketName = "target_bucket_name";

        // Especifique o nome da imagem de origem. Se a imagem não estiver no diretório raiz do bucket, você deve especificar o caminho completo da imagem. Exemplo: sourceDir/source.jpg.
        String sourceKey = "targetDir/target.jpg";

        // O tópico da mensagem MNS.
        String topic = "imm-blindwatermark-test";

        // Crie uma instância do OSSClient.
        // Quando a instância do OSSClient não for mais usada, chame o método shutdown para liberar os recursos.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Declare explicitamente o uso do algoritmo de assinatura V4.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // Extraia o conteúdo da marca d'água da imagem especificada.
            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);

            // Chame a interface de processamento de fluxo assíncrono.
            AsyncProcessObjectResult result = ossClient.asyncProcessObject(request);
            System.out.println(result.getRequestId());
            // Obtenha e imprima o TaskId para acompanhar a tarefa de spooling.
            System.out.println(result.getTaskId());


        } catch (OSSException oe) {
            System.err.println("Capturada uma OSSException, o que significa que sua solicitação chegou ao OSS, mas foi rejeitada com uma resposta de erro por algum motivo.");
            System.err.println("Mensagem de Erro:" + oe.getErrorMessage());
            System.err.println("Código de Erro:" + oe.getErrorCode());
            System.err.println("ID da Solicitação:" + oe.getRequestId());
            System.err.println("ID do Host:" + oe.getHostId());
        } catch (ClientException ce) {
            System.err.println("Capturada uma ClientException, o que significa que o cliente encontrou um problema interno grave ao tentar se comunicar com o OSS, como não conseguir acessar a rede.");
            System.err.println("Mensagem de Erro:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Python

É necessário o SDK para Python 2.18.4 ou posterior.

# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Especifique o endpoint da região onde o bucket está localizado. Por exemplo, se o bucket estiver na região China (Hangzhou), defina o endpoint como https://oss-cn-hangzhou.aliyuncs.com.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Obtenha credenciais de acesso de variáveis de ambiente. Antes de executar o código de exemplo, certifique-se de que as variáveis de ambiente OSS_ACCESS_KEY_ID e OSS_ACCESS_KEY_SECRET estão configuradas.
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Especifique o nome do bucket.
bucket_name = 'target_bucket_name'
# Especifique o nome do arquivo de imagem com marca d'água.
source_key = 'targetDir/target.jpg'
# Especifique o tópico da mensagem MNS.
topic = 'imm-blindwatermark-test'

# Crie uma instância de bucket. Todos os métodos relacionados a arquivos devem ser chamados na instância do bucket.
bucket = oss2.Bucket(auth, endpoint, bucket_name)

# Extraia o conteúdo da marca d'água da imagem especificada.
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('=', ''))

# Chame a interface de processamento de fluxo assíncrono.
result = bucket.async_process_object(source_key, process)
# O ID exclusivo da solicitação da API OSS, usado para rastreamento e solução de problemas.
print(result.request_id)
# O ID exclusivo da tarefa, usado para acompanhar a tarefa de spooling.
print(result.task_id)

Go

É necessário o SDK para Go 3.0.2 ou posterior.

package main

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

func main() {
    // Obtenha credenciais de acesso de variáveis de ambiente. Antes de executar o código de exemplo, certifique-se de que as variáveis de ambiente OSS_ACCESS_KEY_ID e OSS_ACCESS_KEY_SECRET estão configuradas.
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Erro:", err)
        os.Exit(-1)
    }

    // Crie uma instância do OSSClient.
    endpoint := "https://oss-cn-hangzhou.aliyuncs.com"
    client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(provider))
    if err != nil {
        fmt.Println("Erro:", err)
        os.Exit(-1)
    }

    // Especifique o nome do bucket.
    bucketName := "target_bucket_name"
    bucket, err := client.Bucket(bucketName)
    if err != nil {
        handleError(err)
        return
    }

    // Especifique o nome do arquivo de imagem com marca d'água.
    sourceKey := "targetDir/target.jpg"

    // Especifique o tópico da mensagem MNS.
    topic := "imm-blindwatermark-test"

    // Extraia o conteúdo da marca d'água da imagem especificada.
    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)

    // Chame a interface de processamento de fluxo assíncrono.
    result, err := bucket.AsyncProcessObject(sourceKey, process)
    if err != nil {
        handleError(err)
    } else {
        fmt.Println(result.RequestID) // O ID exclusivo da solicitação da API OSS.
        fmt.Println(result.TaskId) // O ID exclusivo da tarefa, usado para acompanhar a tarefa de spooling.
    }
}

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

PHP

É necessário o SDK para PHP 2.7.0 ou posterior.

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

// Obtenha credenciais de acesso de variáveis de ambiente. Antes de executar o código de exemplo, certifique-se de que as variáveis de ambiente OSS_ACCESS_KEY_ID e OSS_ACCESS_KEY_SECRET estão configuradas.
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");

// Neste exemplo, o endpoint está definido como China (Hangzhou). Defina o endpoint para a região real.
$endpoint = 'https://oss-cn-hangzhou.aliyuncs.com';

// Especifique o nome do bucket.
$bucketName = 'target_bucket_name';

// Especifique o nome do arquivo de imagem com marca d'água.
$sourceKey = 'targetDir/target.jpg';

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

try {
    // Crie uma instância do OSSClient.
    $client = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

    // Especifique o tópico da mensagem MNS.
    $topic = 'imm-blindwatermark-test';

    // Extraia o conteúdo da marca d'água da imagem especificada.
    $style = 'image/deblindwatermark,s_low,t_text';
    $encodedTopic = str_replace('=', '', base64_url_encode($topic));
    $process = sprintf('%s|sys/notify,topic_%s', $style, $encodedTopic);

    // Chame a interface de processamento de fluxo assíncrono.
    $result = $client->asyncProcessObject($bucketName, $sourceKey, $process);

    // Analise a string JSON retornada.
    $decodedResult = json_decode($result, true);

    echo "ID da Solicitação: " . $decodedResult['RequestId'] . "\n"; // O ID exclusivo da solicitação da API OSS.
    echo "TaskId: " . $decodedResult['TaskId'] . "\n"; // O ID exclusivo da tarefa, usado para acompanhar a tarefa de spooling.

} catch (OssException $e) {
    echo "Erro: " . $e->getMessage() . "\n";
}
?>

Para obter mais informações sobre como usar outros SDKs, consulte Processamento assíncrono.

Parâmetros

Adicionar uma marca d'água cega

Ação: image/blindwatermark

Parâmetro

Obrigatório

Descrição

Valores válidos

content

Não

O texto da marca d'água deve ser codificado em Base64 seguro para URL. Você pode usar a ferramenta de codificação de marca d'água para codificar o texto. Por exemplo, se o texto for Alibaba Cloud Copyright, o texto codificado será 6Zi_6YeM5LqR54mI5p2D5omA5pyJ.

A string da marca d'água antes da codificação Base64 pode ter até 256 caracteres.

s

Não

A intensidade da marca d'água. Uma intensidade maior oferece melhor resistência a ataques, mas causa distorção de imagem mais perceptível.

  • low (padrão): baixa intensidade.

  • medium: intensidade média.

  • high: alta intensidade.

q

Não

A qualidade da imagem com marca d'água de saída. Uma qualidade maior resulta em um tamanho de imagem maior e melhor qualidade de análise da marca d'água.

Nota

Este parâmetro tem efeito somente se a imagem de entrada estiver no formato JPG.

Valor padrão: 90. Valores válidos: 70 a 100.

O parâmetro sys/saveas também é usado quando você adiciona uma marca d'água cega a uma imagem. Para obter mais informações, consulte Salvar uma imagem em um local especificado.

Analisar uma marca d'água cega

Ação: image/deblindwatermark

Parâmetro

Obrigatório

Descrição

Valores válidos

s

Não

O nível de extração da marca d'água. Um nível mais alto leva mais tempo, mas oferece melhores resultados.

  • low (padrão): nível baixo.

  • medium: nível médio.

  • high: nível alto.

t

Não

O tipo da marca d'água incorporada.

Texto: text

O parâmetro notify também é usado quando você analisa uma marca d'água cega. Para obter mais informações, consulte Notificações.

Operações de API relacionadas

Se seu aplicativo exigir um alto nível de personalização, você pode enviar solicitações da API REST diretamente. Para enviar solicitações da API REST, você deve escrever manualmente o código para calcular a assinatura. Para obter mais informações sobre como calcular o cabeçalho da solicitação Authorization, consulte Assinatura V4 (recomendada). Para adicionar ou analisar uma marca d'água cega, você deve enviar uma solicitação POST e incluir os parâmetros no corpo da solicitação.

Adicionar uma marca d'água cega

Você pode processar imagens adicionando o parâmetro x-oss-process a uma solicitação PostObject. Para obter mais informações, consulte PostObject.

Exemplo de processamento

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

// O conteúdo da marca d'água é "Alibaba Cloud Copyright", a intensidade da marca d'água é baixa, a qualidade da imagem de saída é 90 e a imagem com marca d'água é salva em oss://image-demo/outobjprefix.jpg.
x-oss-process=image/blindwatermark,content_6Zi_6YeM5LqR54mI5p2D5omA5pyJ,s_low,q_90|sys/saveas,b_aW1hZ2UtZGVtbw,o_b3V0b2JqcHJlZml4LmpwZw

Analisar uma marca d'água cega

Você pode processar imagens adicionando parâmetros de dimensionamento de imagem à API PostObject. Para obter mais informações, consulte PostObject.

Exemplo de processamento

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

// Analise a marca d'água adicionada na etapa anterior. O tópico da mensagem é doc-images.
x-oss-async-process=image/deblindwatermark|sys/notify,topic_ZG9jLWltYWdlcw

Observações

  • O recurso de marca d'água cega suporta apenas imagens nos formatos JPG, PNG, BMP, WebP e TIFF.

  • A largura e altura mínimas de uma imagem são 80 pixels. A largura e altura máximas são 10.000 pixels.

  • A proporção da aresta mais curta em relação à aresta mais longa deve ser maior que 1:2.

  • O recurso de marca d'água cega não suporta imagens totalmente pretas, totalmente brancas ou de baixa resolução. Por exemplo, imagens com resolução inferior a 200 × 200 pixels podem não ser suportadas, embora este não seja um limite estrito.

  • Somente marcas d'água de texto são suportadas.

  • Acesso anônimo não é suportado.