Car Image API

客户 · 车身改色、车窗膜与隐形车衣(PPF)门店

如何在客户自己的车型上预览改色膜、车窗膜或隐形车衣(PPF)

改色膜、车窗膜和漆面保护膜门店如何利用白色底图渲染、精确的十六进制车漆颜色和 3D 模型,在施工开始前就在客户自己的车上展示效果。

问题:客户想看到在自己车上的效果

改色膜店、窗膜店或漆面保护膜安装商所卖的东西,客户在施工完成前无法看到。作品集展示的是别人的车。厂商的色卡只是把材料贴在一张平面卡片上。真正促成成交的,是客户自己的 2021 款 M4 换上他们正犹豫不决的那款缎面灰——而这样的照片并不存在,因为这项施工还没有进行。

同样的缺口在产业链下游也会出现。膜材切割商需要某个车型年份前保险杠的清晰轮廓,而图样库尚未覆盖该车型年份。配置器需要一个基础色车辆的转台展示,供设计师在其上重新上色。三者需要的是同一样东西:特定品牌、车型和年份的影棚图片,车漆颜色由他们自选,背景空无一物。

门店使用渲染图的三种方式

目前基于该 API 的改色膜、车窗膜和漆面保护膜集成主要做三件事,有时三件事同时进行:

  • 先渲染白色底车,再叠加材质。以 color=white 渲染客户车辆对应的车型年份,生成透明 PNG,然后在浏览器中将改色膜、车窗膜或印刷设计叠加在上面。PNG 的 Alpha 通道就是车辆轮廓。
  • 按十六进制色值指定车漆。对于纯色改色膜或重新喷漆,无需合成:color=686c70 会直接返回已是该车漆颜色的车辆,玻璃和车轮保持不变,与预设颜色一样计为一张车辆图片。
  • 用于转台展示的 3D 模型。POST /api/v1/3d 会以所选颜色生成该车辆带纹理的 GLB、USDZ 和 FBX 文件,每种车辆和颜色只需生成一次。已发布的模型附带可嵌入报价页面的两行代码,以及客户可在 iPhone 上以 AR 方式打开的 USDZ 文件。

有一家店铺通过 ChatGPT 连接器而非代码来运行批量任务,这是第四种模式,值得在下文单独介绍。

白色底图渲染,再叠加材料

改色膜会取代原车漆,因此应从尽可能少的车漆出发。color=white 可提供最明亮的中性车身,同时保留影棚光影;正侧面的 side 视角展示的侧身面积最大、透视缩短最少,这正是材质预览所需要的。请请求 png(或 webp)格式以保留 alpha 通道,并选择最大尺寸 1024,以便放大查看预览图。

基础渲染图,以及同一辆车换上十六进制色值车漆后的效果
# the customer's exact model year, in white: the base every material goes on top of
curl --fail-with-body -H "Authorization: Bearer $CAR_IMAGE_API_KEY" \
  "https://carimage.dev/api/v1/images/car?vehicle=veh_0ta0ejj0qad2w&view=side&color=white&w=1024&format=png" \
  -o m4-side-white.png

# a solid-color wrap or a factory paint, by hex: the API recolors the paint and leaves glass, trim and wheels alone
curl --fail-with-body -H "Authorization: Bearer $CAR_IMAGE_API_KEY" \
  "https://carimage.dev/api/v1/images/car?vehicle=veh_0ta0ejj0qad2w&view=side&color=686c70&w=1024&format=png" \
  -o m4-side-nardo.png

对于带纹理的材质,合成只需几行 canvas 代码:先绘制一次渲染图作为蒙版,只在车身区域绘制材质,然后以正片叠底(multiply)模式再次绘制渲染图,让其明暗与反光透过材质重新显现。

在浏览器中将材质叠加到底图上
// A textured material (carbon, chrome, a printed design) goes on in the browser.
// The white render is the mask: paint the material only where the car is, then let
// the render's own shading through.
const car = await loadImage(whiteBaseUrl); // transparent PNG from the API
const ctx = canvas.getContext("2d");
canvas.width = car.width;
canvas.height = car.height;

ctx.drawImage(car, 0, 0);
ctx.globalCompositeOperation = "source-atop"; // keep the car's alpha
ctx.fillStyle = ctx.createPattern(materialSwatch, "repeat");
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.globalCompositeOperation = "multiply"; // shading, reflections and panel lines come back
ctx.drawImage(car, 0, 0);
// The whole silhouette is covered, glass and wheels included: the API ships the car's
// alpha, not per-panel masks. Good enough for a quote; a solid color should use color=<hex> instead.

按十六进制色值匹配车漆或改色膜颜色

自从车漆改为基于同一张中性渲染图重新着色后,color 除了 15 个预设名称外,还接受任意六位十六进制值:在 URL 中直接写 color=686c70,在 JSON 中写 "color": "#686c70"。查到厂商的色样或客户的原厂漆代码,传入即可。重新着色只作用于车漆,玻璃、灯具、饰条和轮毂保持原样,这正是贴膜预览与整体调色照片的区别所在。每个十六进制值都会多一个缓存变体,并计为本月的一张车辆图片,因此为一辆车的一个视角试 20 种候选颜色,就是 20 张车辆图片。

用于转台展示和 AR 的 3D 模型

当报价页面需要让车辆旋转展示时,请订购一个模型。POST /api/v1/3d 接收车辆 id 和一种颜色,扣除 100 个积分,并生成带纹理的 GLB、其浏览器版本、USDZ 和 FBX,以及一张缩略图。某车辆的第一个模型需要 10–20 minutes;该车辆的每种额外颜色会在 1–2 minutes 内为同一网格重新贴图。订购您已拥有的车辆和颜色是免费的(billing.already_owned: true),因此店铺可以让每项作业的配置器都基于同一个白色底图。

以白色订购并立即发布
curl -X POST https://carimage.dev/api/v1/3d \
  -H "Authorization: Bearer $CAR_IMAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: wrap-quote-4471" \
  -d '{"vehicle": "veh_0ta0ejj0qad2w", "color": "white", "publish": true}'
202 Accepted(已精简)
{
  "data": {
    "id": "8c1d6b8e-2b4a-4f6e-9a2e-1f3c5d7e9b01",
    "object": "3d_model",
    "status": "queued",
    "progress": 0,
    "vehicle": {
      "id": "veh_0ta0ejj0qad2w",
      "make": "bmw",
      "model": "m4",
      "year": 2021
    },
    "color": "white",
    "files": null,
    "public": {
      "id": "m3d_…",
      "url": "https://carimage.dev/api/v1/3d/public/m3d_…",
      "files": null,
      "embed": {
        "script": "https://carimage.dev/embed/3d.js",
        "html": "<script src=\"https://carimage.dev/embed/3d.js\" async></script>\n<car-3d model=\"m3d_…\"></car-3d>"
      }
    }
  },
  "billing": {
    "charged_on": "creation",
    "credits_charged": 100,
    "credits_remaining": 24900,
    "already_owned": false
  },
  "request_id": "req_01j9y…"
}

publish: true 会在我们的 CDN 上为模型生成无需密钥的 URL 和嵌入代码,甚至在模型就绪之前即可使用;文件到位前,该元素会显示进度。将 view 设为九个机位角度中的任意一个作为开场镜头,设置 spin 实现转台旋转,backdrop 添加影棚地面,ar 则通过浏览器自带的 AR 查看器向 iPhone 提供 USDZ、向 Android 提供 GLB。FBX 供设计师使用:在 Blender 或车衣设计工具中打开,将图案绘制到 UV 上,客户就能在自己的车上看到自己的设计。

报价页面中的嵌入代码
<script src="https://carimage.dev/embed/3d.js" async></script>
<car-3d model="m3d_…" view="front-3-4" spin backdrop="studio" ar alt="2021 BMW M4 in white"></car-3d>

从 ChatGPT 或 Claude 运行批量任务

并非每家门店都有开发人员,而该 API 上最活跃的集成之一,就是运营人员让 AI 助手生成渲染图。将 https://carimage.dev/api/mcp 添加为连接器(ChatGPT 和 Claude 通过 OAuth 登录;由用户在屏幕上批准授权范围),助手即可获得与程序相同的工具:resolve_vehicle 将“2014 Audi S3 cabriolet, grey, side”转换为精确参数,get_car_image 获取单张渲染图,create_car_image_urls 一次调用最多生成五十个签名 URL,create_3d_model 用于生成 360° 转台展示。

要让助手顺利完成批量任务,有两点很重要:

  • 每个批次传入一个 idempotency_key。AI 助手会重试。有了该键,重试的 create_car_image_urls 会重放首次结果(idempotent_replayed: true),且不产生任何费用。
  • 要考虑渲染预算,而不只是速率限制。此前无人请求过的车辆视角需要先行准备,而准备会消耗账户每日的准备算力配额(Pro 为 10%)。一次处理数百辆新车、每辆三个视角,就可能触及上限;此时工具会返回重试时间和 reset_at,不会收取任何费用,已缓存的图片照常提供。可将任务分散到一两个晚上进行,或升级到 Business 以获得更大配额。

各客户端的设置方法及完整工具列表,请参阅MCP 页面。

CLI、SDK 和 MCP

npx @meterapp/car-image
# the white base and a hex paint, straight to files
npx @meterapp/car-image get --vehicle veh_0ta0ejj0qad2w --view side --color white --width 1024 --out m4-side-white.png
npx @meterapp/car-image get --vehicle veh_0ta0ejj0qad2w --view side --color 686c70 --width 1024 --out m4-side-nardo.png

# the 3D model: published at once, polled until ready, every file downloaded
npx @meterapp/car-image 3d create --vehicle veh_0ta0ejj0qad2w --color white --publish --wait --out ./models
使用 TypeScript SDK
import { CarImageClient } from "@meterapp/car-image-sdk";

const client = new CarImageClient({ apiKey: process.env.CAR_IMAGE_API_KEY });

// 100 credits the first time. Ordering the same vehicle in the same color again
// answers billing.already_owned: true and charges nothing.
const { data: model } = await client.create3dModel({ vehicle: "veh_0ta0ejj0qad2w" }, { color: "white", publish: true });
const ready = await client.wait3dModel(model.id, { onProgress: (m) => console.log(m.stage, m.progress) });

// FBX for the designer's tool of choice, USDZ for the customer's iPhone, glb_web for the page.
const fbx = await client.download3dModel(ready.id, "fbx");
const embedHtml = ready.public?.embed.html;
  • MCP:核心工具集包含 get_car_image 和 create_car_image_urls,使用 ?toolset=all 时还包含 create_3d_model、get_3d_model 和 publish_3d_model;每个图像工具都接受 vehicle 和十六进制 color 参数。
  • 3D 文档介绍了 webhook(模型生成完成时发送一次签名 POST 请求)、文件大小及所有嵌入属性;图片页面上的颜色部分介绍了车漆规则。

常见问题

自定义十六进制颜色比预设颜色更贵吗?
不会。每种颜色都是对该车辆同一个预处理视角的重新着色,因此无论是预设颜色、您查到的原厂色号,还是车衣厂商的色卡,都只计为一张车辆图片。与某个预设色卡相同的十六进制色值即视为该预设颜色。
渲染图的精度足以用来裁膜吗?
不能。渲染图是该品牌、车型和年份的影棚视觉图,而非 CAD 数据或原厂照片:目录不区分配置版本,同一辆车的两个视角之间,钣金线条也可能存在差异。请将其用于向客户展示他们的车并为施工报价;裁切图样请依据模板或车辆实物。
能否获取不带车漆的车辆,或者只获取车窗?
最接近空白模板的是透明 PNG 上的 color=white,PNG 的 alpha 通道即车辆轮廓。该 API 不提供按车身面板或车窗玻璃划分的蒙版。如需纯色改色膜效果,请交给 color=<hex> 处理:它会重新为车漆着色,玻璃、饰条和轮毂保持不变。
车窗膜或隐形车衣报价应使用哪些视角?
使用正视角:side(或 side-right)用于展示车门玻璃和车身侧面,front 用于前挡风玻璃遮阳条、引擎盖和保险杠,rear 用于后挡风玻璃。客户最有反应的是四分之三视角,因此主图使用 front-3-4,各明细项旁边使用正视角。
3D 模型归我们所有吗?
它与渲染图一样采用授权方式:每个账户按车辆和颜色支付一次,再次订购免费,您可在自己的产品中使用并保存在自己的服务器上,套餐结束后也不例外。您已拥有的车辆每新增一种颜色,都会为同一网格重新贴图;发布后,模型将免费获得无需密钥的 URL 和嵌入代码。