Seedream 5.0 Pro đã ra mắt | Thử trong Trình tạo ảnh →

Patina Image to Map

wavespeed-ai /

PATINA generates seamless high-resolution PBR material maps (basecolor, normal, roughness, metalness, height) from a single image, ready for use in Unreal, Unity, Blender, and other 3D pipelines. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

image-to-image
Input

Kéo & thả hoặc nhấp để tải lên

preview

Idle

$0.06per run·~16 / $1

Next:

ExamplesView all

Related Models

README

Patina Image-to-Map

Patina Image-to-Map generates a complete set of PBR (Physically Based Rendering) material maps from a single input image. Upload any photograph or render — the model produces all 5 map types in one run, ready for use in game engines, 3D tools, and real-time rendering pipelines.

Why Choose This?

  • Complete PBR map generation Generates all 5 material maps from a single image in one run — no manual authoring or separate processing steps required.

  • Works on any surface image Compatible with photographs of real-world materials, textures, and renders for versatile workflow integration.

  • Production-ready output Maps are formatted for direct use in game engines (Unreal, Unity), 3D tools (Blender, Maya), and real-time rendering pipelines.

  • Simple single-input workflow Just one image in, five maps out. No configuration required.

Parameters

ParameterRequiredDescription
imageYesURL of the input image (photograph or render) to generate PBR maps from.

How to Use

  1. Upload your image — provide a photograph or render of the surface material via URL.
  2. Submit — the model generates all 5 PBR material maps in a single run.
  3. Download your complete map set ready for use in your 3D pipeline.

Pricing

Just $0.06 per run (5 maps).

Best Use Cases

  • Game development — Generate complete PBR material sets from photo references for real-time game assets.
  • 3D environment art — Rapidly produce material maps for architectural visualization and scene building.
  • Texture authoring — Accelerate material creation workflows by generating map sets from existing photography.
  • Asset digitization — Convert photographs of real-world surfaces into production-ready PBR materials.
  • Indie & rapid prototyping — Quickly populate 3D scenes with physically accurate materials without manual map authoring.

Pro Tips

  • Use well-lit, evenly illuminated surface photos for the most accurate albedo and normal map extraction.
  • Avoid images with strong directional shadows — diffuse, neutral lighting produces the cleanest maps.
  • Crop your input image to focus on the material surface and minimize irrelevant background areas.
  • High-resolution input images produce more detailed and accurate map outputs.

Notes

  • image is the only required field.
  • Each run generates 5 PBR map types as output.
  • Ensure image URLs are publicly accessible if using a link rather than a direct upload.
  • Please ensure your content complies with WaveSpeed AI's usage policies.
Lưu ý:This website uses AI models provided by third parties.

Patina Image To Map API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/wavespeed-ai/patina/image-to-map with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Patina Image To Map below.

HTTP example
set -euo pipefail

: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"

REQUEST_BODY=$(cat <<'JSON'
{
    "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/patina/image-to-map" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $WAVESPEED_API_KEY" \
  -d "$REQUEST_BODY")

TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
  printf 'Submission response did not contain a prediction id
' >&2
  exit 1
fi
RESULT_URL=$(printf '%s' "$TASK" | jq -r '.urls.get // empty')
if [ -z "$RESULT_URL" ]; then
  RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
fi

# 2. Poll until the prediction finishes.
while true; do
  RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
    -H "Authorization: Bearer $WAVESPEED_API_KEY")
  RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
  STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
  case "$STATUS" in
    completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
    failed|cancelled|timeout) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
    created|processing) sleep 2 ;;
    *) printf 'Unexpected status: %s
' "$STATUS" >&2; exit 1 ;;
  esac
done
Node.js example
const submitUrl = "https://api.wavespeed.ai/api/v3/wavespeed-ai/patina/image-to-map";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');

async function requestJson(url, options = {}) {
  const response = await fetch(url, options);
  if (!response.ok) throw new Error(await response.text());
  return response.json();
}

// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
        "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
  `https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;

// 2. Poll until the prediction finishes.
while (true) {
  const resultBody = await requestJson(resultUrl, {
    headers: { "Authorization": `Bearer ${apiKey}` },
  });
  const result = resultBody.data ?? resultBody;
  if (result.status === "completed") {
    console.log(result.outputs);
    break;
  }
  if (["failed", "cancelled", "timeout"].includes(result.status)) throw new Error(JSON.stringify(result));
  if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
  await new Promise(resolve => setTimeout(resolve, 2000));
}
Python example
import json
import os
import time
from urllib.request import Request, urlopen

api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
    "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
}

def request_json(url, data=None):
    request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
    with urlopen(request) as response:
        return json.load(response)

# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/wavespeed-ai/patina/image-to-map", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
    raise RuntimeError("Submission response did not contain a prediction id")
result_url = task.get("urls", {}).get("get") or f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"

# 2. Poll until the prediction finishes.
while True:
    result_body = request_json(result_url)
    result = result_body.get("data", result_body)
    status = result.get("status")
    if status == "completed":
        print(result.get("outputs", []))
        break
    if status in {"failed", "cancelled", "timeout"}:
        raise RuntimeError(result)
    if status not in {"created", "processing"}:
        raise RuntimeError(f"Unexpected status: {status}")
    time.sleep(2)

Patina Image To Map API — Frequently asked questions

What is the Patina Image To Map API?

Patina Image To Map is a WaveSpeedAI model for image editing, exposed as a REST API on WaveSpeedAI. PATINA generates seamless high-resolution PBR material maps (basecolor, normal, roughness, metalness, height) from a single image, ready for use in Unreal, Unity, Blender, and other 3D pipelines. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.

How do I call the Patina Image To Map API?

POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/wavespeed-ai/patina-image-to-map.

How much does Patina Image To Map cost per run?

Patina Image To Map starts at $0.060 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.

What inputs does Patina Image To Map accept?

Key inputs: `image`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/wavespeed-ai/patina-image-to-map.

How long does Patina Image To Map take to generate?

Average end-to-end generation time on WaveSpeedAI is around 31 seconds per request — measured across recent runs. Queue time scales with global demand; live status is visible in the prediction record.

Can I use Patina Image To Map outputs commercially?

Commercial usage rights depend on the model's license, set by its provider (WaveSpeedAI). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.

Patina Image to Map | Fast Image Editing API | WaveSpeedAI