ReWords.AI API

图片

如何把图片发送给 ReWords.AI API——URL、base64、data URL 或 multipart 上传——以及大小和格式限制、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。

发送图片的四种方式

每个请求只能用其中一种。一种都不发,或者发了不止一种,会返回 400 invalid_request。

1. image_url

一个公开的 http(s) 链接。我们在处理你的请求时下载一次,所以签名链接只需要在我们响应之前有效。 我们最多跟随 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 会让文件变大约三分之一,所以整个 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 文件上传

发送 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 和框都指转正后的图片——也就是你在看图软件里看到的样子。
  • 透明区域变成白色。 PNG 和 WebP 的透明部分会被铺到白色背景上,因为结果是 JPEG。

结果

  • 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(四舍五入)。 要发送你自己的框,就反向换算并取整。

本页内容