ReWords.AI API

画像

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"}]'
upload.mjs — Node.js 18+
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 ヘッダーを送ってください。Python urllib の既定値は 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(四捨五入)です。 自分でボックスを送るときは、逆向きに変換して整数に丸めてください。

このページの内容