全部产品
Search
文档中心

Object Storage Service:Blind watermarking

更新时间:Jan 10, 2026

Untuk citra yang disimpan dalam bucket Object Storage Service (OSS), Anda dapat menggunakan fitur blind watermarking untuk menambahkan dan mengurai watermark teks tak terlihat.

Ikhtisar

Dengan blind watermarking, Anda dapat menyematkan informasi teks tak terlihat ke dalam citra tanpa memengaruhi kualitas visualnya. Untuk mengambil konten watermark tersebut, gunakan operasi penguraian blind watermark. Konten watermark tetap dapat diurai dengan benar meskipun citra mengalami serangan pada tingkat tertentu, seperti pemotongan (cropping), penskalaan (scaling), coretan (doodling), atau pertukaran warna (color swapping).

Skenario

  • Otentikasi dan akuntabilitas: Tentukan apakah citra Anda telah dicuri oleh penyerang berbahaya.

  • Pemeriksaan unggahan duplikat: Tentukan apakah citra yang diunggah sudah ada di pustaka sumber daya.

  • Pencegahan kebocoran sumber daya: Dapatkan informasi mengenai sumber kebocoran dari blind watermark yang disematkan pada citra yang didistribusikan.

Cara Menggunakan

  • Tambahkan blind watermark: Gunakan metode pemrosesan sinkron (x-oss-process). Setelah watermark ditambahkan, citra akan disimpan sebagai file baru.

  • Urai blind watermark: Gunakan metode pemrosesan asinkron (x-oss-async-process). Watermark teks yang diurai akan disertakan dalam pesan asinkron.

Prasyarat

  • Layanan Intelligent Media Management (IMM) telah diaktifkan.

  • Proyek IMM telah dibuat dan di-bind. Untuk informasi selengkapnya tentang cara mengikat proyek di Konsol OSS, lihat Quick Start. Untuk informasi selengkapnya tentang cara mengikat proyek menggunakan API, lihat AttachOSSBucket.

  • Saat mengurai blind watermark, bucket yang berisi citra harus berada di wilayah yang sama dengan bucket yang digunakan saat watermark ditambahkan. Bucket tersebut juga harus di-bind ke proyek IMM yang sama yang digunakan untuk menambahkan watermark. Jika tidak, watermark tidak dapat diurai.

Tambahkan blind watermark

Action: image/blindwatermark

Langkah-langkah pengkodean watermark

  1. Encode konten dalam Base64.

  2. Anda dapat mengganti bagian-bagian tertentu dari hasil encoding tersebut.

    • Ganti tanda plus (+) dengan tanda hubung (-).

    • Ganti garis miring (/) dengan garis bawah (_).

    • Hilangkan semua tanda sama dengan (=) di akhir string.

Java

Diperlukan SDK untuk Java versi 3.17.4 atau yang lebih baru.

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 {
        // Pada contoh ini, endpoint diatur ke China (Hangzhou). Atur endpoint sesuai wilayah sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Tentukan ID wilayah yang sesuai dengan endpoint. Misalnya, jika endpoint adalah oss-cn-hangzhou.aliyuncs.com, atur wilayah ke cn-hangzhou.
        String region = "cn-hangzhou";
        // Jangan hard-code kredensial akses dalam proyek Anda. Jika tidak, kredensial akses dapat bocor dan membahayakan keamanan semua sumber daya Anda.
        // Pada contoh ini, kredensial akses diperoleh dari variabel lingkungan. Sebelum menjalankan kode contoh, konfigurasikan variabel lingkungan tersebut.
        EnvironmentVariableCredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();

        // Tentukan nama bucket. Contoh: examplebucket.
        String bucketName = "examplebucket";

        // Tentukan nama citra sumber. Jika citra tidak berada di direktori root bucket, Anda harus menentukan path lengkap citra tersebut. Contoh: sourceDir/source.jpg.
        String sourceImage = "sourceDir/source.jpg";

        // Buat instance OSSClient.
        // Setelah instance OSSClient tidak digunakan lagi, panggil metode shutdown untuk melepaskan sumber daya.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Secara eksplisit nyatakan penggunaan algoritma signature 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);

            // Tentukan konten watermark.
            String content = "Copyright © Alibaba Cloud";
            // Tambahkan blind watermark.
            // Perbaikan: Gunakan URL-safe Base64 encoding dan hapus padding.
            String encodedContentStr = java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(content.getBytes(StandardCharsets.UTF_8));
            String styleType = "image/blindwatermark,content_" + encodedContentStr;

            // Tentukan nama citra hasil pemrosesan. Jika citra tidak berada di direktori root bucket, Anda harus menentukan path lengkap citra tersebut. Contoh: targetDir/target.jpg.
            String targetImage = "targetDir/target.jpg";
            // Perbaikan: Gunakan URL-safe Base64 encoding dan hapus padding untuk targetImage dan 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("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, tetapi ditolak dengan respons error karena suatu alasan.");
            System.err.println("Pesan Error:" + oe.getErrorMessage());
            System.err.println("Kode Error:" + oe.getErrorCode());
            System.err.println("Request ID:" + oe.getRequestId());
            System.err.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.err.println("Terjadi ClientException, yang berarti client mengalami masalah internal serius saat mencoba berkomunikasi dengan OSS, seperti tidak dapat mengakses jaringan.");
            System.err.println("Pesan Error:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Python

Diperlukan SDK untuk Python versi 2.18.4 atau yang lebih baru.

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

# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Tentukan nama bucket tempat citra sumber disimpan.
source_bucket_name = 'source_bucket_name'
# Tentukan nama bucket tempat Anda ingin menyimpan citra hasil pemrosesan. Bucket ini harus berada di wilayah yang sama dengan bucket sumber.
target_bucket_name = 'target_bucket_name'
# Tentukan nama citra sumber. Jika citra tidak berada di direktori root bucket, Anda harus menentukan path lengkap citra tersebut. Contoh: sourceDir/source.jpg.
source_image_name = 'sourceDir/source.jpg'

# Buat instance bucket. Semua metode terkait file harus dipanggil pada instance bucket ini.
bucket = oss2.Bucket(auth, endpoint, source_bucket_name)

# Tentukan konten watermark.
content = 'Copyright © Alibaba Cloud'

# Tambahkan blind watermark.
style = "image/blindwatermark,content_{0}".format(oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(content))))

# Tentukan nama citra hasil pemrosesan. Jika citra tidak berada di direktori root bucket, Anda harus menentukan path lengkap citra tersebut. Contoh: 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

Diperlukan SDK untuk Go versi 3.0.2 atau yang lebih baru.

package main

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

func main() {
	// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Buat instance OSSClient.
	// Atur yourEndpoint ke endpoint bucket. Pada contoh ini, digunakan endpoint bucket di wilayah China (Hangzhou). Sesuaikan endpoint dengan endpoint sebenarnya.
	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Tentukan nama bucket tempat citra sumber disimpan.
	bucketName := "srcbucket"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		handleError(err)
		return
	}

	// Tentukan nama citra sumber. Jika citra tidak berada di direktori root bucket, Anda harus menentukan path lengkap citra tersebut. Contoh: sourceDir/source.jpg.
	sourceImageName := "sourceDir/source.jpg"

	// Tentukan nama bucket tempat Anda ingin menyimpan citra hasil pemrosesan. Bucket ini harus berada di wilayah yang sama dengan bucket sumber.
	targetBucketName := "destbucket"

	// Tentukan nama citra hasil pemrosesan. Jika citra tidak berada di direktori root bucket, Anda harus menentukan path lengkap citra tersebut. Contoh: targetDir/target.jpg.
	targetImageName := "targetDir/target.jpg"

	// Tentukan konten watermark.
	content := "Copyright © Alibaba Cloud"

	// Hasilkan blind watermark. Sesuai dokumentasi, Anda harus menghapus tanda sama dengan (=) di akhir.
	encodedContent := strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(content)), "=")
	style := fmt.Sprintf("image/blindwatermark,content_%s", encodedContent)
	// Anda juga harus menghapus tanda sama dengan (=) di akhir dari nama citra dan nama bucket yang telah di-encode.
	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("Error:", err)
	os.Exit(-1)
}

PHP

Diperlukan SDK untuk PHP versi 2.7.0 atau yang lebih baru.

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

// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");

// Atur yourEndpoint ke endpoint bucket. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";

// Tentukan nama bucket. Contoh: examplebucket.
$bucket = "examplebucket";

// Tentukan nama citra sumber. Jika citra tidak berada di direktori root bucket, Anda harus menentukan path lengkap citra tersebut. Contoh: sourceDir/source.jpg.
$object = "sourceDir/source.jpg";

// Tentukan nama citra hasil pemrosesan. Jika citra tidak berada di direktori root bucket, Anda harus menentukan path lengkap citra tersebut. Contoh: 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);

    // Jika citra hasil tidak berada di bucket yang ditentukan, unggah citra tersebut ke bucket tujuan.
    // $ossClient->uploadFile($bucket, $object, "D:\\localpath\\exampleobject.jpg");

    $content = "Copyright © Alibaba Cloud";
    // Tambahkan blind watermark ke citra.
    $encodedContent = base64url_encode($content);
    $style = "image/blindwatermark,content_$encodedContent";

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

    // Beri nama citra hasil sebagai example-new.png dan simpan ke bucket saat ini.
    $result = $ossClient->processObject($bucket, $object, $process);
    // Cetak hasil pemrosesan.
    print_r($result);
} catch (OssException $e) {
    echo "Error: " . $e->getMessage();
}
?>

Untuk informasi selengkapnya tentang penggunaan bahasa lain, lihat Save As.

Urai blind watermark

Action: image/deblindwatermark

Java

Diperlukan SDK untuk Java versi 3.17.4 atau yang lebih baru.

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 {
        // Pada contoh ini, endpoint diatur ke China (Hangzhou). Atur endpoint sesuai wilayah sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Tentukan ID wilayah yang sesuai dengan endpoint. Misalnya, jika endpoint adalah oss-cn-hangzhou.aliyuncs.com, atur wilayah ke cn-hangzhou.
        String region = "cn-hangzhou";
        // Jangan hard-code kredensial akses dalam proyek Anda. Jika tidak, kredensial akses dapat bocor dan membahayakan keamanan semua sumber daya Anda.
        // Pada contoh ini, kredensial akses diperoleh dari variabel lingkungan. Sebelum menjalankan kode contoh, konfigurasikan variabel lingkungan tersebut.
        EnvironmentVariableCredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();

        // Tentukan nama bucket. Contoh: examplebucket.
        String bucketName = "target_bucket_name";

        // Tentukan nama citra sumber. Jika citra tidak berada di direktori root bucket, Anda harus menentukan path lengkap citra tersebut. Contoh: sourceDir/source.jpg.
        String sourceKey = "targetDir/target.jpg";

        // Topik pesan MNS.
        String topic = "imm-blindwatermark-test";

        // Buat instance OSSClient.
        // Setelah instance OSSClient tidak digunakan lagi, panggil metode shutdown untuk melepaskan sumber daya.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Secara eksplisit nyatakan penggunaan algoritma signature V4.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // Ekstrak konten watermark dari citra yang ditentukan.
            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);
            
            // Panggil antarmuka pemrosesan aliran asinkron.
            AsyncProcessObjectResult result = ossClient.asyncProcessObject(request);
            System.out.println(result.getRequestId());
            // Dapatkan dan cetak TaskId untuk melacak tugas spooling.
            System.out.println(result.getTaskId());
            

        } catch (OSSException oe) {
            System.err.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, tetapi ditolak dengan respons error karena suatu alasan.");
            System.err.println("Pesan Error:" + oe.getErrorMessage());
            System.err.println("Kode Error:" + oe.getErrorCode());
            System.err.println("Request ID:" + oe.getRequestId());
            System.err.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.err.println("Terjadi ClientException, yang berarti client mengalami masalah internal serius saat mencoba berkomunikasi dengan OSS, seperti tidak dapat mengakses jaringan.");
            System.err.println("Pesan Error:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Python

Diperlukan SDK untuk Python versi 2.18.4 atau yang lebih baru.

# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Tentukan nama bucket.
bucket_name = 'target_bucket_name'
# Tentukan nama file citra yang telah diberi watermark.
source_key = 'targetDir/target.jpg'
# Tentukan topik pesan MNS.
topic = 'imm-blindwatermark-test'

# Buat instance bucket. Semua metode terkait file harus dipanggil pada instance bucket ini.
bucket = oss2.Bucket(auth, endpoint, bucket_name)

# Ekstrak konten watermark dari citra yang ditentukan.
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('=', ''))

# Panggil antarmuka pemrosesan aliran asinkron.
result = bucket.async_process_object(source_key, process)
# ID unik permintaan API OSS, digunakan untuk pelacakan dan troubleshooting.
print(result.request_id)
# ID unik tugas, digunakan untuk melacak tugas spooling.
print(result.task_id)

Go

Diperlukan SDK untuk Go versi 3.0.2 atau yang lebih baru.

package main

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

func main() {
    // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // Buat instance OSSClient.
    endpoint := "https://oss-cn-hangzhou.aliyuncs.com"
    client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(provider))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // Tentukan nama bucket.
    bucketName := "target_bucket_name" 
    bucket, err := client.Bucket(bucketName)
    if err != nil {
        handleError(err)
        return
    }

    // Tentukan nama file citra yang telah diberi watermark.
    sourceKey := "targetDir/target.jpg"

    // Tentukan topik pesan MNS.
    topic := "imm-blindwatermark-test"

    // Ekstrak konten watermark dari citra yang ditentukan.
    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)

    // Panggil antarmuka pemrosesan aliran asinkron.
    result, err := bucket.AsyncProcessObject(sourceKey, process)
    if err != nil {
        handleError(err)
    } else {
        fmt.Println(result.RequestID) // ID unik permintaan API OSS.
        fmt.Println(result.TaskId) // ID unik tugas, digunakan untuk melacak tugas spooling.
    }
}

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

PHP

Diperlukan SDK untuk PHP versi 2.7.0 atau yang lebih baru.

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

// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");

// Pada contoh ini, endpoint diatur ke China (Hangzhou). Atur endpoint sesuai wilayah sebenarnya.
$endpoint = 'https://oss-cn-hangzhou.aliyuncs.com';

// Tentukan nama bucket.
$bucketName = 'target_bucket_name'; 

// Tentukan nama file citra yang telah diberi watermark.
$sourceKey = 'targetDir/target.jpg';

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

try {
    // Buat instance OSSClient.
    $client = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

    // Tentukan topik pesan MNS.
    $topic = 'imm-blindwatermark-test';

    // Ekstrak konten watermark dari citra yang ditentukan.
    $style = 'image/deblindwatermark,s_low,t_text';
    $encodedTopic = str_replace('=', '', base64_url_encode($topic));
    $process = sprintf('%s|sys/notify,topic_%s', $style, $encodedTopic);

    // Panggil antarmuka pemrosesan aliran asinkron.
    $result = $client->asyncProcessObject($bucketName, $sourceKey, $process);
    
    // Uraikan string JSON yang dikembalikan.
    $decodedResult = json_decode($result, true);
    
    echo "Request ID: " . $decodedResult['RequestId'] . "\n"; // ID unik permintaan API OSS.
    echo "TaskId: " . $decodedResult['TaskId'] . "\n"; // ID unik tugas, digunakan untuk melacak tugas spooling.

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

Untuk informasi selengkapnya tentang cara menggunakan SDK lainnya, lihat Asynchronous processing.

Parameter

Tambahkan blind watermark

Action: image/blindwatermark

Parameter

Wajib

Deskripsi

Nilai yang valid

content

Tidak

Teks watermark harus di-encode dalam bentuk URL-safe Base64. Anda dapat menggunakan alat pengkodean watermark untuk meng-encode teks tersebut. Misalnya, jika teksnya adalah Alibaba Cloud Copyright, teks yang di-encode adalah 6Zi_6YeM5LqR54mI5p2D5omA5pyJ.

String watermark sebelum di-encode Base64 dapat memiliki panjang hingga 256 karakter.

s

Tidak

Kekuatan watermark. Kekuatan yang lebih tinggi memberikan ketahanan lebih baik terhadap serangan tetapi menyebabkan distorsi citra yang lebih terlihat.

  • low (default): kekuatan rendah.

  • medium: kekuatan sedang.

  • high: kekuatan tinggi.

q

Tidak

Kualitas citra hasil ber-watermark. Kualitas yang lebih tinggi menghasilkan ukuran citra yang lebih besar dan kualitas penguraian watermark yang lebih baik.

Catatan

Parameter ini hanya berlaku jika citra input berformat JPG.

Nilai default: 90. Nilai yang valid: 70 hingga 100.

Parameter sys/saveas juga digunakan saat Anda menambahkan blind watermark ke citra. Untuk informasi selengkapnya, lihat Simpan citra ke lokasi tertentu.

Urai blind watermark

Action: image/deblindwatermark

Parameter

Wajib

Deskripsi

Nilai yang valid

s

Tidak

Tingkat ekstraksi watermark. Tingkat yang lebih tinggi memerlukan waktu lebih lama tetapi memberikan hasil lebih baik.

  • low (default): tingkat rendah.

  • medium: tingkat sedang.

  • high: tingkat tinggi.

t

Tidak

Jenis watermark yang disematkan.

Teks: text

Parameter notify juga digunakan saat Anda mengurai blind watermark. Untuk informasi selengkapnya, lihat Notifikasi.

Operasi API Terkait

Jika aplikasi Anda memerlukan tingkat kustomisasi yang tinggi, Anda dapat mengirim permintaan REST API secara langsung. Untuk mengirim permintaan REST API, Anda harus menulis kode secara manual untuk menghitung signature. Untuk informasi selengkapnya tentang cara menghitung header permintaan Authorization, lihat Signature V4 (disarankan). Untuk menambahkan atau mengurai blind watermark, Anda harus mengirim permintaan POST dan menyertakan parameter dalam badan permintaan.

Tambahkan blind watermark

Anda dapat memproses citra dengan menambahkan parameter x-oss-process ke permintaan PostObject. Untuk informasi selengkapnya, lihat PostObject.

Contoh pemrosesan

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

// Konten watermark adalah "Alibaba Cloud Copyright", kekuatan watermark rendah, kualitas citra hasil 90, dan citra ber-watermark disimpan ke oss://image-demo/outobjprefix.jpg.
x-oss-process=image/blindwatermark,content_6Zi_6YeM5LqR54mI5p2D5omA5pyJ,s_low,q_90|sys/saveas,b_aW1hZ2UtZGVtbw,o_b3V0b2JqcHJlZml4LmpwZw

Urai blind watermark

Anda dapat memproses citra dengan menambahkan parameter penskalaan citra ke API PostObject. Untuk informasi selengkapnya, lihat PostObject.

Contoh pemrosesan

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

// Urai watermark yang ditambahkan pada langkah sebelumnya. Topik pesan adalah doc-images.
x-oss-async-process=image/deblindwatermark|sys/notify,topic_ZG9jLWltYWdlcw

Catatan

  • Fitur blind watermarking hanya mendukung citra dalam format JPG, PNG, BMP, WebP, dan TIFF.

  • Lebar dan tinggi minimum citra adalah 80 piksel. Lebar dan tinggi maksimum adalah 10.000 piksel.

  • Rasio sisi terpendek terhadap sisi terpanjang harus lebih besar dari 1:2.

  • Fitur blind watermarking tidak mendukung citra hitam pekat, putih pekat, atau citra beresolusi rendah. Misalnya, citra dengan resolusi kurang dari 200 × 200 piksel mungkin tidak didukung, meskipun ini bukan batasan ketat.

  • Hanya watermark teks yang didukung.

  • Akses anonim tidak didukung.