画像
ReWords.AI API に画像を送る方法(URL、base64、data URL、マルチパートアップロード)、サイズと形式の上限、EXIF と透過の扱い、結果ファイル、ボックスとピクセルの対応。
送れるもの
| 上限 | |
|---|---|
| 形式 | JPEG、PNG、WebP。ファイル名や Content-Type ではなく、ファイルの中身から判定します。 |
| ファイルサイズ | 最大 20 MB(20 × 1024 × 1024 バイト。28 MB の JSON 本文の上限も同じ数え方です)。 |
| サイズ | 長辺は最大 8000 px、短辺は最低 32 px。 |
| 色 | RGB またはグレースケール。CMYK の JPEG は 400 invalid_image で拒否されます。 |
| アニメーション | アニメーション WebP は最初のフレームだけを使います。 |
これらに反するファイルは、課金される前に 400 invalid_image で拒否されます。
画像を送る 4 つの方法
1 つのリクエストで使うのは 1 つだけです。何も送らない、または 2 つ以上送ると 400 invalid_request が返ります。
1. image_url
公開された http(s) リンク。リクエストを処理する間に 1 回だけダウンロードするので、署名付きリンクは応答するまで
有効であれば十分です。リダイレクトは 3 回まで追い、15 秒で諦めます。ダウンロードできない場合は 400 invalid_image が返ります。
Cookie やログインが必要なリンク、localhost、10.x.x.x、192.168.x.x などのプライベートネットワーク上のアドレスは使えません。
{ "image_url": "https://example.com/banner.png" }2. image_base64
ファイルのバイトを標準の base64(A–Z a–z 0–9 + /、パディングは任意)にしたもの、または同じ内容の任意のメディアタイプの
data URL です。たとえば data:image/png;base64, や、ブラウザの FileReader が生成することのある
data:application/octet-stream;base64, も使えます。形式はバイトから判定します。空白と改行は無視されるので、Linux の base64
や Python の base64.encodebytes が出力する 76 文字ごとの行もそのまま使えます。base64 はファイルを約 3 分の 1 大きくするため、
JSON 本文全体は最大 28 MB まで送れます。それより大きい本文は 400 invalid_image を返します。有効な base64 でないテキストは
400 invalid_request、有効な base64 でも対応していない画像なら 400 invalid_image を返します。
{ "image_base64": "iVBORw0KGgoAAAANSUhEUgAA..." }
{ "image_base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." }3. マルチパートでのファイルアップロード
multipart/form-data で、ファイルを image フィールドに入れて送ります。POST /edits では、replacements 配列を
JSON 文字列としてフォームフィールドに入れます。match、language、callback_url は通常のフォームフィールドです。
curl https://api.rewords.ai/v1/edits \
-H "Authorization: Bearer $REWORDS_API_KEY" \
-F [email protected] \
-F 'replacements=[{"from":"SALE","to":"HOT DEAL"}]'import crypto from 'node:crypto';
import fs from 'node:fs';
const form = new FormData();
form.append('image', new Blob([await fs.promises.readFile('banner.png')]), 'banner.png');
form.append('replacements', JSON.stringify([{ from: 'SALE', to: 'HOT DEAL' }]));
const res = await fetch('https://api.rewords.ai/v1/edits', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.REWORDS_API_KEY}`, // let fetch set the multipart Content-Type
'Idempotency-Key': crypto.randomUUID(), // a new key per job; reuse it only to resend this same job
},
body: form,
});
const job = await res.json();
if (!res.ok) throw new Error(`${res.status} ${job.error.code}: ${job.error.message}`);
console.log(job.id, job.status);4. image_id
POST /ocr は image_id を返します。24 時間以内にそれを POST /edits に渡すと、画像を送り直さずにアップロード済みの画像を
再利用できます。作成したアカウントでのみ使えます。不明、期限切れ、または他のアカウントの id は 400 invalid_request を返します。
OCR を呼び出すたびに新しい image_id が返ります。以前送った画像でも同じで、image_id を POST /ocr に送った場合も新しく
24 時間が得られます。
画像の読み取り方
- 最初に EXIF の向きを適用します。 横向きに保存されたスマートフォンの写真はまっすぐに直され、すべての
width、height、 ボックスは直した後の画像(画像ビューアーで見える向き)を指します。 - 透明な部分は白になります。 結果が JPEG なので、PNG と WebP の透過は白い背景に合成されます。
結果
results.A.url、results.B.url、results.C.urlは公開リンク上の JPEG ファイルです。通常のGETでダウンロードでき、 API キーは不要です。リンクを持っている人は誰でも開けるので、非公開として扱ってください。- ダウンロード時は
User-Agentヘッダーを送ってください。Pythonurllibの既定値は403で拒否されます。requests、curl、ブラウザー、Node のfetchはそのまま使えます。 - リンクは少なくとも 7 日間保持されます。残したいものはダウンロードしてください。
- 結果ファイルは EXIF の向きなしでまっすぐ保存されるので、ファイル上のサイズが見たままのサイズです。
- B は元の画像に新しいテキストを溶け込ませたものです。A は AI が画像全体を描き直したもので、元の画像の縦横比を保ちます。 ピクセルサイズはアップロードと同じだと決めつけず、ファイルから読み取ってください。
- C(4K)は最大約 830 万画素(3840 × 2160 相当)、長辺は最大 3840 px、縦横比は同じです。縦または横が 3:1 を超える画像では作られません。
ボックスとピクセル
ボックスは [x, y, width, height] で、直した後の画像に対する 0–1000 のスケールの整数です。左上の角から測ります。
width と height は 1 以上、x + width と y + height が 1000 を超えることはありません。
pixel left = x / 1000 * imageWidth
pixel top = y / 1000 * imageHeight
pixel width = width / 1000 * imageWidth
pixel height = height / 1000 * imageHeight例:1080 × 1350 の画像でボックス [120, 80, 300, 60] は、左 130、上 108、324 × 81 px(四捨五入)です。
自分でボックスを送るときは、逆向きに変換して整数に丸めてください。