八月跨境上新季,商品图翻译限时优惠:季度会员赠送 300 积分,年度会员赠送 4000 积分,钻石会员赠送 10000 积分!

图片水印合成 (Watermark)

支持多种模板(平铺、九宫格、单点)和自定义样式的图片水印合成。
POSThttps://******/tools/watermark消耗: 1 积分 / 10次
同步接口,处理完成后直接返回 JSON。
请求参数
名称类型必填描述
AccountIdstring账号ID。
Timestampstring当前时间戳(毫秒级,CST/UTC+8时区)。
Imagestring图片 URL 或 Base64 字符串。
TemplateKeystring模板ID,详情请见下方表格。
Textstring水印文字内容,不填则使用模板默认。
Colorstring【覆盖配置】文字颜色,支持 Hex (#FF0000) 或 rgba(255,0,0,1)。
Opacityint【覆盖配置】不透明度 (0-100)。
Sizeint【覆盖配置】字体大小 (px)。
Signaturestring请求签名。
返回示例
{
    "Code": 200,
    "Message": "Success",
    "Data": {
        "Base64": "...",
        "Width": 1024,
        "Height": 768
    }
}
支持的模板列表 (TemplateKey)
TemplateKey说明
single_subtle_light【右下角】白色半透明(通用版权,默认)
special_multiline【左下角】支持多行文字,白色半透明
single_strong_red【正中心】红色醒目大字(警示专用,带倾斜)
multiple_corners【四角】四个角落同时添加水印
multiple_edges【四边】上下左右四边边缘居中添加水印
pattern_subtle【平铺-正】全图正向平铺,灰色(低干扰)
pattern_diagonal_da【平铺-斜】全图斜向平铺,深灰色(防盗图首选)
special_photography【右下角】摄影参数风格(等宽字体)
special_confidential【印章】正中心红色“绝密文件”印章(带边框)
special_approved【印章】正中心绿色“审核通过”印章(带边框)
Python 调用示例
# -*- coding: utf-8 -*-
import base64
import hashlib
import hmac
import json
import time
import requests

API_ENDPOINT = "https://******/tools/watermark"
ACCOUNT_ID = "pic_YOUR_ID"
SECRET_KEY = "YOUR_SECRET_KEY"

def generate_signature(params, secret_key):
    sorted_params = sorted(params.items())
    param_string = "&".join(
        f"{key}={value}"
        for key, value in sorted_params
        if value is not None and value != "" and key != "Signature"
    )
    sign_string = f"{param_string}&SecretKey={secret_key}"
    signature = hmac.new(
        secret_key.encode("utf-8"),
        sign_string.encode("utf-8"),
        hashlib.sha256
    ).digest()
    return base64.b64encode(signature).decode("utf-8")

def call_api():
    params = {
        "AccountId": ACCOUNT_ID,
        "Timestamp": str(int(time.time() * 1000)),
        "Image": "https://example.com/test.jpg",
        "TemplateKey": "pattern_diagonal_da",
        "Text": "仅供内部传阅",
        "Opacity": 80,
    }
    params["Signature"] = generate_signature(params, SECRET_KEY)

    response = requests.post(API_ENDPOINT, json=params, timeout=60)

    try:
        print(json.dumps(response.json(), indent=2, ensure_ascii=False))
    except ValueError:
        print(response.text)

if __name__ == "__main__":
    call_api()
Java 调用示例
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;

public class PicTechWatermarkDemo {
    private static final String API_URL = "https://******/tools/watermark";
    private static final String ACCOUNT_ID = "pic_YOUR_ID";
    private static final String SECRET_KEY = "YOUR_SECRET_KEY";

    public static void main(String[] args) throws Exception {
        Map<String, Object> params = new TreeMap<>();
        params.put("AccountId", ACCOUNT_ID);
        params.put("Timestamp", String.valueOf(System.currentTimeMillis()));
        params.put("Image", "https://example.com/test.jpg");
        params.put("TemplateKey", "pattern_diagonal_da");
        params.put("Text", "仅供内部传阅");
        params.put("Opacity", 80);
        params.put("Signature", generateSignature(params, SECRET_KEY));

        String jsonBody = buildJson(params);
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(API_URL))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(jsonBody))
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }

    private static String generateSignature(Map<String, Object> params, String secretKey) throws Exception {
        String paramString = params.entrySet().stream()
                .filter(entry -> entry.getValue() != null && !entry.getValue().toString().isEmpty())
                .map(entry -> entry.getKey() + "=" + entry.getValue())
                .collect(Collectors.joining("&"));
        String signString = paramString + "&SecretKey=" + secretKey;

        Mac hmacSha256 = Mac.getInstance("HmacSHA256");
        hmacSha256.init(new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
        return Base64.getEncoder().encodeToString(
                hmacSha256.doFinal(signString.getBytes(StandardCharsets.UTF_8))
        );
    }

    private static String buildJson(Map<String, Object> params) {
        return "{" + params.entrySet().stream()
                .map(entry -> "\"" + entry.getKey() + "\":" + toJsonValue(entry.getValue()))
                .collect(Collectors.joining(",")) + "}";
    }

    private static String toJsonValue(Object value) {
        if (value instanceof Number || value instanceof Boolean) {
            return value.toString();
        }
        return "\"" + escapeJson(value.toString()) + "\"";
    }

    private static String escapeJson(String value) {
        return value
                .replace("\\", "\\\\")
                .replace("\"", "\\\"")
                .replace("\n", "\\n")
                .replace("\r", "\\r")
                .replace("\t", "\\t");
    }
}
图片水印合成 (Watermark) - 图片基础处理 (工具箱) API文档