Poster Translation

Description

Poster translation.

Version

4.0

Image Requirements

JPG and PNG formats are supported. The long edge of the image must not exceed 4,096 pixels.

API URL

    Production environment: https://openapi.meitu.com
    Task submission endpoint: https://openapi.meitu.com/api/v1/sdk/sync/push
    Task name (task): /v1/image_translation/492027
    Task type (task_type): formula

Method

POST

Content-Type: application/json

Authentication

Open Platform API Signature

Credits cannot be used to pay for API calls. Please visit the MV console to activate this API and purchase or manage resource packages.

Request Parameters

RequiredParameterTypeDescription
YesparamsstringAlgorithm parameters (JSON string)
Yesinit_imagesobject[]Media file list
YestaskstringFixed value: /v1/image_translation/492027
Yestask_typestringFixed value: formula
Nosync_timeoutintSynchronous timeout; default: 30

The structure of each item in the init_images media file list is as follows:

RequiredParameterTypeDescription
YesurlstringImage URL or base64-encoded data
YesprofileobjectMedia profile information

The profile object is described below:

RequiredParameterTypeDescription
Yesmedia_profilesobjectMedia properties
YesversionstringFixed value: v1

The media_profiles object is described below:

RequiredParameterTypeDescription
Yesmedia_data_typestringurl indicates a URL; jpg and png indicate base64-encoded data in the corresponding format

The params inference parameter is a JSON string with the following structure:

RequiredFieldTypeDescription
Norsp_media_typestringDefault: url; jpg indicates base64-encoded data
YesparameterobjectCore algorithm parameter object

Algorithm parameters in parameter:

RequiredFieldTypeDescription
Yeseliminate_typestringElimination type; default: big
Yesonly_text_eliminatebooleanWhether to eliminate text only; default: false
Yesori_langstringSource language for image layering; default: ch. Supported values: Simplified Chinese (ch), Traditional Chinese (chinese_cht), English (en), Japanese (japan), and Korean (korean)
Yesposter_translate_flagstringFixed parameter for image layering: 9 for layering and 1 for image translation
Yessubject_protect_flagbooleanWhether text on the product subject should be separated into a layer (subject protection): false for no and true for yes
Yestarget_langstringTarget language; default: ch
Yesbusiness_side_flagstringEnables text editing; default: an empty string
Yesgenerate_picture_flagstring0 for layering; in translation scenarios, 1 returns the translated image URL and 0 returns the translated image recipe

Request Example

{
  "task": "/v1/image_translation/492027",
  "task_type": "formula",
  "init_images": [
    {
      "url": "https://obs.mtlab.meitu.com/public/EtRGxLI8ulQ43pGhuZfym9aYUD2PUbMP/MTc4MDMwNDQwMA==/3dd132d2-f503-411c-7258-cdfe400fca08.jpeg",
      "profile": {
        "media_profiles": {
          "media_data_type": "url"
        },
        "version": "v1"
      }
    }
  ],
  "params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"eliminate_type\":\"big\",\"only_text_eliminate\":false,\"ori_lang\":\"ch\",\"poster_translate_flag\":\"1\",\"subject_protect_flag\":true,\"target_lang\":\"en\",\"business_side_flag\":\"\",\"generate_picture_flag\":\"0\"}}",
  "sync_timeout": 30
}

Response Fields

Generated results are periodically deleted. Download and save them promptly.
FieldTypeDescription
request_idstringRequest identifier
trace_idstringTrace identifier
codeintBusiness status code; 0 indicates that the request was accepted successfully
error_codeintError code; 0 on success
messagestringBusiness message
tipsanyAdditional information
dataobjectTask status and algorithm result

Fields in data:

FieldTypeDescription
statusintStatus code: -1 task not found; 0 created; 1 running; 2 failed; 9 timed out—use the Query API; 10 succeeded
resultobjectAlgorithm result
progressnumberTask progress
predict_elapsedintEstimated processing time, in milliseconds
create_timeint64Creation timestamp, in milliseconds
task_idstringTask ID
custom_task_idstringClient-defined task ID
trace_idstringTrace identifier
client_infostringClient information
init_imagesobject[]/nullEchoed input media

Fields in result:

FieldTypeDescription
idstringUnique task identifier
parametersobjectAlgorithm parameter information; return_json_data contains the layering or translation result JSON
dataobjectDetailed data returned by the algorithm
msgstringResult message
msg_idstringMessage ID
mtlab_resobjectUnderlying algorithm result

Fields in result.parameters.return_json_data:

FieldTypeDescription
codenumberError code; 0 indicates success
cost_timestringProcessing time, in seconds
error_messagestringError message
json_datastringLayering or translation result as a JSON string, including template configuration, layer information, text regions, and other data

Fields in json_data:

FieldTypeDescription
versionstringTemplate version
namestringTemplate name
templateConfarrayLayer configuration array containing background layers, text layers, and other layers
text_graphic_box_infoarrayText graphic region information
previewstringPreview image URL
widthnumberTemplate width
heightnumberTemplate height
generate_picture_urlstringGenerated image URL; contains the translated image in translation scenarios

Fields for each layer in templateConf:

FieldTypeDescription
idstringUnique layer identifier
layerTypestringLayer type, such as bg (background) or text (text)
widthnumberLayer width
heightnumberLayer height
leftnumberX-coordinate of the top-left corner
topnumberY-coordinate of the top-left corner
rotatenumberRotation angle
opacitynumberOpacity
hiddenbooleanWhether the layer is hidden
textstringText content (text layers)
ori_rotatenumberOriginal rotation angle
textOristringOriginal text content retained after translation
colorstringText color, such as #040403
fontSizenumberFont size
fontFamilystringFont name
urlstringImage asset URL (for background layers and similar layers)
sub_namestringSublayer name, such as Main_Title, Subtitle, or Horizontal_Text

Fields in result.data:

FieldTypeDescription
durationobjectTiming statistics for each processing stage
error_codenumberAlgorithm error code; 0 indicates success
error_msgstringAlgorithm error message
extraobjectAdditional fields
media_info_listarrayMedia information list
msg_idstringMessage ID
parameterobjectEchoed parameters

Fields in duration:

FieldTypeDescription
alg_process_timenumberAlgorithm processing time, in milliseconds
created_timestampnumberTask creation timestamp, in seconds
pull_timestampnumberResource retrieval timestamp, in seconds
repost_timenumberRetry time
upload_timenumberUpload time, in milliseconds
waiting_timenumberQueue wait time, in milliseconds

Fields in mtlab_res:

FieldTypeDescription
ErrorCodenumberUnderlying error code
ErrorMsgstringUnderlying error message
error_codenumberError code (compatibility field)
error_msgstringError message (compatibility field)
media_info_listarrayMedia information list
msg_idstringMessage ID
parameterobjectParameter information

Response Examples

Successful Response Example

{
  "request_id": "",
  "trace_id": "",
  "code": 0,
  "error_code": 0,
  "message": "success",
  "tips": null,
  "data": {
    "status": 10,
    "result": {
      "id": "t_mt1a3i5n7bcf03ec36-e830-449f-bb0f-173500efaa1c",
      "parameters": {
        "return_json_data": {
          "code": 0,
          "cost_time": "22.980",
          "error_message": "",
          "json_data": "{\"version\":\"11.0.0\",\"name\":\"The aroma of qingtuan fills the air.\",\"preview\":\"https://mt-deepnet-models-release.oss-cn-beijing.aliyuncs.com/deepnet/cloud/7252e262-60a7-11f1-9f7a-c69948c4966f.jpg\",\"generate_picture_url\":\"\"}"
        }
      },
      "data": {
        "duration": {
          "alg_process_time": 23204,
          "created_timestamp": 1780640770,
          "pull_timestamp": 1780640770,
          "repost_time": 0,
          "upload_time": 0,
          "waiting_time": 66
        },
        "error_code": 0,
        "error_msg": "success",
        "extra": {},
        "media_info_list": [],
        "msg_id": "ba2299eb-4392-4845-6aa0-r009c6429cb6",
        "parameter": {
          "return_json_data": {
            "code": 0,
            "cost_time": "22.980",
            "error_message": ""
          }
        }
      },
      "msg": "success",
      "msg_id": "ba2299eb-4392-4845-6aa0-r009c6429cb6",
      "mtlab_res": {
        "ErrorCode": 0,
        "ErrorMsg": "",
        "error_code": 0,
        "error_msg": "",
        "media_info_list": null,
        "msg_id": "ba2299eb-4392-4845-6aa0-r009c6429cb6",
        "parameter": null
      }
    },
    "progress": 1,
    "predict_elapsed": 10000,
    "create_time": 1780640770692,
    "task_id": "t_mt1a3i5n7bcf03ec36-e830-449f-bb0f-173500efaa1c",
    "custom_task_id": "",
    "trace_id": "",
    "client_info": "",
    "init_images": null
  }
}

Pending Response Example

Use the Query API to retrieve the result.

Response Status: 200

Content-Type: application/json; charset=utf-8

{
  "request_id": "",
  "trace_id": "",
  "code": 0,
  "error_code": 0,
  "message": "success",
  "tips": null,
  "data": {
    "status": 9,
    "result": {
      "id": "t_mt1a3i5n7b4bcba123-xxxx-45a1-88d1-c625b75c4591"
    },
    "progress": 0,
    "predict_elapsed": 10000,
    "create_time": 1770285187417,
    "task_id": "t_mt1a3i5n7b4bcba123-xxxx-45a1-88d1-c625b75c4591",
    "custom_task_id": "",
    "trace_id": "ace75fe5-xxxx-46ad-a1db-cbcfde308f8a",
    "client_info": "",
    "init_images": null
  }
}

Failed Response Example

Response Status: 400

Content-Type: application/json; charset=utf-8

{
  "request_id": "",
  "trace_id": "",
  "code": 20001,
  "error_code": 20001,
  "message": "PROCESS_ERROR",
  "tips": null,
  "data": {
    "status": 2,
    "result": {
      "error_code": 20001,
      "error_msg": "PROCESS_ERROR"
    },
    "progress": 0,
    "predict_elapsed": 0,
    "create_time": 0,
    "task_id": "",
    "custom_task_id": "",
    "trace_id": "",
    "client_info": "",
    "init_images": null
  }
}

General Error Codes and Messages

API-specific error: 20001 indicates PROCESS_ERROR (processing error).

See API Error Codes for details.

SDK Examples

Python

import json

import requests
from sign_sdk import sign

def api_call_example():
    key = "your_api_key"
    secret = "your_api_secret"
    url = "https://openapi.meitu.com/api/v1/sdk/sync/push"
    method = "POST"

    headers = {
        "Content-Type": "application/json",
        sign.HeaderHost: "openapi.meitu.com",
    }
    inner_params = {
        "rsp_media_type": "url",
        "parameter": {
            "eliminate_type": "big",
            "only_text_eliminate": False,
            "ori_lang": "ch",
            "poster_translate_flag": "1",
            "subject_protect_flag": True,
            "target_lang": "en",
            "business_side_flag": "",
            "generate_picture_flag": "0",
        },
    }
    payload = {
        "task": "/v1/image_translation/492027",
        "task_type": "formula",
        "init_images": [
            {
                "url": "https://obs.mtlab.meitu.com/public/EtRGxLI8ulQ43pGhuZfym9aYUD2PUbMP/MTc4MDMwNDQwMA==/3dd132d2-f503-411c-7258-cdfe400fca08.jpeg",
                "profile": {
                    "media_profiles": {"media_data_type": "url"},
                    "version": "v1",
                },
            }
        ],
        "params": json.dumps(inner_params, ensure_ascii=False),
        "sync_timeout": 30,
    }
    body = json.dumps(payload, ensure_ascii=False)

    signer = sign.Signer(key, secret)
    signed_request = signer.sign(url, method, headers, body)
    response = requests.Session().send(signed_request)
    print(f"Status: {response.status_code}")
    print(f"Response: {response.text}")

if __name__ == "__main__":
    api_call_example()

Go

package main

import (
	"fmt"
	"io"
	"net/http"

	"github.com/mtlab/api/signer"
)

func main() {
	key := "your_api_key"
	secret := "your_api_secret"
	signObj := signer.NewSigner(key, secret)

	url := "https://openapi.meitu.com/api/v1/sdk/sync/push"
	method := http.MethodPost
	headers := make(http.Header)
	headers.Set(signer.HeaderHost, "openapi.meitu.com")
	headers.Set("Content-Type", "application/json")

	body := `{
  "task": "/v1/image_translation/492027",
  "task_type": "formula",
  "init_images": [{
    "url": "https://obs.mtlab.meitu.com/public/EtRGxLI8ulQ43pGhuZfym9aYUD2PUbMP/MTc4MDMwNDQwMA==/3dd132d2-f503-411c-7258-cdfe400fca08.jpeg",
    "profile": {
      "media_profiles": {"media_data_type": "url"},
      "version": "v1"
    }
  }],
  "params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"eliminate_type\":\"big\",\"only_text_eliminate\":false,\"ori_lang\":\"ch\",\"poster_translate_flag\":\"1\",\"subject_protect_flag\":true,\"target_lang\":\"en\",\"business_side_flag\":\"\",\"generate_picture_flag\":\"0\"}}",
  "sync_timeout": 30
}`

	req, err := signObj.Sign(url, method, headers, body)
	if err != nil {
		fmt.Println("Failed to sign request:", err)
		return
	}

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		fmt.Println("Failed to send request:", err)
		return
	}
	defer resp.Body.Close()

	responseBody, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Read response failed:", err)
		return
	}
	fmt.Println("Response:", resp.StatusCode, string(responseBody))
}

PHP

<?php
require 'signer.php';

$key = 'your_api_key';
$secret = 'your_api_secret';
$signer = new Signer($key, $secret);

$url = 'https://openapi.meitu.com/api/v1/sdk/sync/push';
$method = 'POST';
$headers = ['Content-Type' => 'application/json'];

$innerParams = json_encode([
    'rsp_media_type' => 'url',
    'parameter' => [
        'eliminate_type' => 'big',
        'only_text_eliminate' => false,
        'ori_lang' => 'ch',
        'poster_translate_flag' => '1',
        'subject_protect_flag' => true,
        'target_lang' => 'en',
        'business_side_flag' => '',
        'generate_picture_flag' => '0',
    ],
]);

$body = json_encode([
    'task' => '/v1/image_translation/492027',
    'task_type' => 'formula',
    'init_images' => [
        [
            'url' => 'https://obs.mtlab.meitu.com/public/EtRGxLI8ulQ43pGhuZfym9aYUD2PUbMP/MTc4MDMwNDQwMA==/3dd132d2-f503-411c-7258-cdfe400fca08.jpeg',
            'profile' => [
                'media_profiles' => ['media_data_type' => 'url'],
                'version' => 'v1',
            ],
        ],
    ],
    'params' => $innerParams,
    'sync_timeout' => 30,
]);

$curl = $signer->sign($url, $method, $headers, $body);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

if ($status === 0) {
    echo 'Error: ' . curl_error($curl);
} else {
    echo "Status: {$status}\n";
    echo "Response: {$response}\n";
}
curl_close($curl);
?>

Java

package com.meitu.openai.common;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws Exception {
        Signer signer = new Signer("your_api_key", "your_api_secret");
        String url = "https://openapi.meitu.com/api/v1/sdk/sync/push";
        String method = "POST";

        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        headers.put(Signer.HeaderHost, "openapi.meitu.com");

        String body = "{\n" +
                "  \"task\": \"/v1/image_translation/492027\",\n" +
                "  \"task_type\": \"formula\",\n" +
                "  \"init_images\": [{\n" +
                "    \"url\": \"https://obs.mtlab.meitu.com/public/EtRGxLI8ulQ43pGhuZfym9aYUD2PUbMP/MTc4MDMwNDQwMA==/3dd132d2-f503-411c-7258-cdfe400fca08.jpeg\",\n" +
                "    \"profile\": {\n" +
                "      \"media_profiles\": {\"media_data_type\": \"url\"},\n" +
                "      \"version\": \"v1\"\n" +
                "    }\n" +
                "  }],\n" +
                "  \"params\": \"{\\\"rsp_media_type\\\":\\\"url\\\",\\\"parameter\\\":{\\\"eliminate_type\\\":\\\"big\\\",\\\"only_text_eliminate\\\":false,\\\"ori_lang\\\":\\\"ch\\\",\\\"poster_translate_flag\\\":\\\"1\\\",\\\"subject_protect_flag\\\":true,\\\"target_lang\\\":\\\"en\\\",\\\"business_side_flag\\\":\\\"\\\",\\\"generate_picture_flag\\\":\\\"0\\\"}}\",\n" +
                "  \"sync_timeout\": 30\n" +
                "}";

        Map<String, String> signedHeaders = signer.sign(url, method, headers, body);
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        connection.setRequestMethod(method);
        for (Map.Entry<String, String> entry : signedHeaders.entrySet()) {
            connection.setRequestProperty(entry.getKey(), entry.getValue());
        }
        connection.setDoOutput(true);
        connection.getOutputStream().write(body.getBytes(StandardCharsets.UTF_8));

        int status = connection.getResponseCode();
        InputStream stream = status >= 400
                ? connection.getErrorStream()
                : connection.getInputStream();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            System.out.println("Response: " + status + " " + response);
        }
    }
}