API 요청
/rest/draw_watermark_image요청 파라미터 6개 · 필수 2
imagewm- 예시
SAMPLE
font_size- 예시
10
color- 예시
EEEEEE
opacity- 예시
0.5
density- 예시
10
응답 필드 파일
정상 응답은 파일 본문입니다. 실패 시 JSON 오류가 올 수 있으므로 HTTP 상태와 Content-Type을 먼저 확인하세요.
이미지 위에 지정한 글자를 반복 무늬로 새긴 PNG 이미지를 돌려줍니다. 응답은 JSON이 아닌 이미지 파일입니다.
https://apick.app/rest/draw_watermark_image왜 Image 워터마크 삽입인가
상품 사진과 작품 이미지를 무단으로 퍼가는 일은 매일 일어나고, 일일이 편집해 로고를 넣기엔 손이 모자랍니다. 이미지에 워터마크를 자동으로 넣어 노출될 때마다 브랜드가 함께 보이게 합니다.
REQUEST_TOO_LARGE 오류가 반환되며 과금되지 않습니다.
상품 사진·시안·신분증 사본처럼 다른 용도로 쓰이면 안 되는 이미지에 "SAMPLE", "제출용" 같은 표시를 넣을 때 사용합니다. PNG·JPEG·WEBP·BMP 이미지를 받으며 결과는 항상 PNG입니다.
선택 항목도 함께 보내는 것을 권장합니다. 아래 표의 기본값을 그대로 넣으면 생략했을 때와 같은 결과를 얻습니다.
성공한 건당 10P입니다. 실패 응답은 과금되지 않습니다.
/rest/draw_watermark_imageimagewmSAMPLEfont_size10colorEEEEEEopacity0.5density10정상 응답은 파일 본문입니다. 실패 시 JSON 오류가 올 수 있으므로 HTTP 상태와 Content-Type을 먼저 확인하세요.
POST https://apick.app/rest/draw_watermark_imageAuthorization: Bearer 내 계정의 API 인증키multipart/form-data상황별로 보내는 값과 응답에서 확인할 값을 모았습니다. 언어 탭에서 그대로 복사해 쓸 수 있습니다.
기본값을 그대로 함께 보내 옅은 회색 글자를 넣습니다.
/rest/draw_watermark_imagecurl --fail-with-body --request POST 'https://apick.app/rest/draw_watermark_image' \
--header "Authorization: Bearer $APICK_API_KEY" \
--form 'image=@./product.jpg' \
--form-string 'wm=SAMPLE' \
--form-string 'font_size=10' \
--form-string 'color=EEEEEE' \
--form-string 'opacity=0.5' \
--form-string 'density=10' \
--dump-header response.headers --output result.png
# response.headers의 Content-Type을 확인한 뒤 파일을 사용하세요.import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("image", new Blob([await readFile("./product.jpg")]), "product.jpg");
form.append("wm", "SAMPLE");
form.append("font_size", "10");
form.append("color", "EEEEEE");
form.append("opacity", "0.5");
form.append("density", "10");
const response = await fetch("https://apick.app/rest/draw_watermark_image", {
method: "POST",
headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
body: form,
signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
if ((response.headers.get("content-type") || "").includes("json")) {
throw new Error(JSON.stringify(await response.json()));
}
const { writeFile } = await import("node:fs/promises");
await writeFile("result.png", new Uint8Array(await response.arrayBuffer()));import os
import requests
parts = [
("image", ("product.jpg", open("./product.jpg", "rb"))),
("wm", (None, "SAMPLE")),
("font_size", (None, "10")),
("color", (None, "EEEEEE")),
("opacity", (None, "0.5")),
("density", (None, "10")),
]
response = requests.request("POST", "https://apick.app/rest/draw_watermark_image",
headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
files=parts,
timeout=(10, 120), stream=True)
response.raise_for_status()
if "json" in response.headers.get("Content-Type", ""):
raise RuntimeError(response.json())
with open("result.png", "wb") as output:
for chunk in response.iter_content(65536):
output.write(chunk)<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
'image' => new CURLFile('./product.jpg'),
'wm' => 'SAMPLE',
'font_size' => '10',
'color' => 'EEEEEE',
'opacity' => '0.5',
'density' => '10',
];
$curl = curl_init('https://apick.app/rest/draw_watermark_image');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $form,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$type = curl_getinfo($curl, CURLINFO_CONTENT_TYPE) ?: "";
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
if (strpos($type, "json") !== false) { throw new RuntimeException($body); }
file_put_contents('result.png', $body);output.png로 저장하세요.사본이 다른 곳에 쓰이지 않도록 진하고 큰 글자로 넣습니다.
/rest/draw_watermark_imagecurl --fail-with-body --request POST 'https://apick.app/rest/draw_watermark_image' \
--header "Authorization: Bearer $APICK_API_KEY" \
--form 'image=@./copy.jpg' \
--form-string 'wm=제출용' \
--form-string 'font_size=40' \
--form-string 'color=000000' \
--form-string 'opacity=0.3' \
--form-string 'density=8' \
--dump-header response.headers --output result.png
# response.headers의 Content-Type을 확인한 뒤 파일을 사용하세요.import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("image", new Blob([await readFile("./copy.jpg")]), "copy.jpg");
form.append("wm", "제출용");
form.append("font_size", "40");
form.append("color", "000000");
form.append("opacity", "0.3");
form.append("density", "8");
const response = await fetch("https://apick.app/rest/draw_watermark_image", {
method: "POST",
headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
body: form,
signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
if ((response.headers.get("content-type") || "").includes("json")) {
throw new Error(JSON.stringify(await response.json()));
}
const { writeFile } = await import("node:fs/promises");
await writeFile("result.png", new Uint8Array(await response.arrayBuffer()));import os
import requests
parts = [
("image", ("copy.jpg", open("./copy.jpg", "rb"))),
("wm", (None, "제출용")),
("font_size", (None, "40")),
("color", (None, "000000")),
("opacity", (None, "0.3")),
("density", (None, "8")),
]
response = requests.request("POST", "https://apick.app/rest/draw_watermark_image",
headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
files=parts,
timeout=(10, 120), stream=True)
response.raise_for_status()
if "json" in response.headers.get("Content-Type", ""):
raise RuntimeError(response.json())
with open("result.png", "wb") as output:
for chunk in response.iter_content(65536):
output.write(chunk)<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
'image' => new CURLFile('./copy.jpg'),
'wm' => '제출용',
'font_size' => '40',
'color' => '000000',
'opacity' => '0.3',
'density' => '8',
];
$curl = curl_init('https://apick.app/rest/draw_watermark_image');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $form,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$type = curl_getinfo($curl, CURLINFO_CONTENT_TYPE) ?: "";
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
if (strpos($type, "json") !== false) { throw new RuntimeException($body); }
file_put_contents('result.png', $body);font_size는 10~100, density는 5~15, opacity는 0~1 범위입니다.wm은 30자 이하로 보내세요.HTTP 성공과 업무 결과를 구분하세요. 경로별 응답 필드와 예시는 위 요청과 응답에 함께 있습니다.
성공하면 워터마크가 들어간 PNG 본문이 바로 옵니다. 내려받기 파일명은 output.png입니다.
1이면 처리에 성공한 것입니다.image/png응답을 아래 순서로 확인하세요. 결과 유무와 과금 여부는 서로 다릅니다.
실패하면 이미지 대신 JSON이 옵니다. HTTP 상태와 Content-Type을 먼저 확인하고, JSON이면 data.error 문구를 기록하세요. 실패 응답의 api.cost는 0입니다.
wm에 글자를 넣으세요.wm을 30자 이하로 줄이세요.image로 보냈는지 확인하세요.FORM_DATA_INVALIDFORM_DATA_FIELD_CONFLICTMULTIPART_LIMIT_OR_PARSE_ERROR실제 차감 금액은 응답의 api.cost로 확인하세요. 상세 요금은 요금정책에서 볼 수 있습니다.
같은 요청을 JavaScript와 Python으로 옮긴 예시입니다. 키는 환경변수 APICK_API_KEY 에서 읽습니다.