HiAPI
博客

使用指南

Flux-2-Klein-4b 图生图用于电商产品照片

一份在 hiapi API 上使用 flux-2-klein-4b/image-to-image 编辑现有产品照片的实操工作流——包含真实提示词、真实输出以及批量代码。

2026年11月3日
Flux-2-Klein-4b 图生图用于电商产品照片

为什么选择编辑产品照片而不是重新拍摄

一张产品主图很少能覆盖商品列表所需的全部内容。电商平台的网格展示需要一张干净的白底图片。博客文章或广告需要同一个产品置身于生活场景中。季节性营销活动需要一种可能尚不存在的颜色或材质变体。为每一个变体都重新拍摄既慢又昂贵——而且大多数时候,产品的几何结构(形状、logo 位置、比例)根本不应该改变,只有背景或某一种材质需要变化。

这正是 hiapi API 上的 flux-2-klein-4b/image-to-image 所擅长的任务:它接收一张现有的产品照片以及一条编辑指令,生成一张新图片,其中你没有要求改变的一切都保持原样。它是 FLUX.2 [klein] 系列中快速、高性价比的档位——不是在你从零生成产品时该选的模型,但一旦你已经有了一张满意的基础照片,它就非常合适。

下面是对同一张起始照片执行的两项真实编辑,附有使用的确切提示词,以及一段用于在整个产品目录上运行此流程的批量脚本。

起始照片

这是下面每一项编辑所基于的基础图片:哑光黑色头戴式耳机,拍摄于纯灰色影棚背景——一张典型的产品列表“修改前”照片,需要更多变体。

编辑 1:将产品放入生活场景中

使用的提示词:

保持耳机完全不变(形状、哑光黑色饰面、logo、比例均不改变)。将纯灰色影棚背景替换为温暖的生活场景:耳机放在浅橡木木质书桌上,旁边有一台合上的 MacBook、一盆小绿植和一个陶瓷咖啡杯,柔和的自然窗光从左侧照入,浅景深,温馨的家庭办公室风格编辑类产品摄影。

关键做法在于第一句话:在描述新背景之前,明确告诉模型哪些部分必须保持完全一致(形状、饰面、logo、比例)。没有这个锚点,图生图模型有时会连带场景一起改变产品的比例或饰面。有了它,耳机原样保留,只有周围的环境发生变化。

编辑 2:替换材质而不改动形状

使用的提示词:

保持耳机的形状、比例、logo 和拍摄角度完全不变。仅将耳垫和头梁衬垫的材质与颜色从哑光黑色改为带有可见缝线的棕褐色皮革质感,而外壳/头梁支臂保持哑光黑色。保持纯灰色影棚背景和灯光不变,电商目录产品摄影。

这次编辑比生活场景那次范围更窄:相同的背景、相同的灯光、相同的拍摄角度——只有耳垫和头梁衬垫的材质从哑光黑色变为棕褐色皮革。将指令限定得如此精确(指明确切的部件、指明确切的材质),正是让产品其余部分——外壳、logo、轮廓——不发生变化的原因。

这些编辑为何可靠

  • 指明哪些保持不变,而不只是哪些改变。 在编辑指令之前加上“保持形状、logo 和比例不变”,其作用胜过对新背景或新材质堆砌的任何细节描述。
  • 对目标要字面化。 “带有可见缝线的棕褐色皮革质感”比“让它看起来高端”给模型留下的解读空间更小。
  • 每条提示词只做一项编辑。 背景替换和材质替换单独执行都效果良好;把多个不相关的更改堆叠进一条提示词,往往会模糊锚点,让不需要的细节发生偏移。
  • 在各变体之间复用同一张基础照片。 本指南中的每张图片都从同一张源照片开始,这正是它们能够一起用于同一个商品列表或营销活动的原因。

批量编辑产品目录

上述两项编辑使用相同的请求结构:一个现有的图片 URL 加上一条编辑提示词,提交到 hiapi 的异步任务端点。下面的代码片段将这一过程循环遍历一个 (base_image_url, prompt, output_name) 元组列表——这就是你会用来将整个目录批量处理成一批背景或材质变体的相同模式。

import os
import time
import requests

API_BASE = "https://api.hiapi.ai/v1/tasks"
TOKEN = os.environ["HIAPI_API_KEY"]
MODEL = "flux-2-klein-4b/image-to-image"


def submit_edit(base_image_url: str, prompt: str) -> str:
    resp = requests.post(
        API_BASE,
        headers={"Authorization": f"Bearer {TOKEN}"},
        json={
            "model": MODEL,
            "input": {
                "prompt": prompt,
                "image_urls": [base_image_url],
                "resolution": "1 MP",
            },
        },
        timeout=60,
    )
    resp.raise_for_status()
    return resp.json()["data"]["taskId"]


def wait_and_download(task_id: str, out_path: str, poll_s: int = 5, timeout_s: int = 300) -> None:
    deadline = time.time() + timeout_s
    while time.time() < deadline:
        r = requests.get(
            f"{API_BASE}/{task_id}",
            headers={"Authorization": f"Bearer {TOKEN}"},
            timeout=30,
        )
        task = r.json().get("data", {})
        if task.get("status") == "success":
            url = task["output"][0]["url"]
            img = requests.get(url, timeout=120)
            with open(out_path, "wb") as f:
                f.write(img.content)
            return
        if task.get("status") == "fail":
            raise RuntimeError(task.get("error"))
        time.sleep(poll_s)
    raise TimeoutError(f"task {task_id} did not finish in {timeout_s}s")


# One entry per product / variant you need.
batch = [
    ("https://cdn.example.com/products/headphones-black.jpg",
     "Keep the product exactly as-is (shape, finish, logo, proportions). "
     "Replace the background with a warm lifestyle desk scene, soft natural "
     "light from the left.",
     "headphones-lifestyle.jpg"),
    ("https://cdn.example.com/products/headphones-black.jpg",
     "Keep the shape, proportions, logo, and camera angle exactly as they "
     "are. Change only the ear cushion and headband padding material to tan "
     "brown leather with visible stitching; background and lighting stay "
     "the same.",
     "headphones-tan-leather.jpg"),
]

for base_url, prompt, out_name in batch:
    task_id = submit_edit(base_url, prompt)
    wait_and_download(task_id, out_name)
    print(f"saved {out_name}")

每次调用都是独立的,因此对于大型目录,你通常会并发运行一小组这样的任务(几个 worker 通常就够了——瓶颈是任务 API 本身,而不是你的客户端),而不是严格地一次循环一个。

定价

flux-2-klein-4b/image-to-image 按图片计费,并随输出分辨率增加而提高。截至 2026-08,本指南中两项编辑所使用的 1MP 档位费用为每张图片 $0.00715;请查看定价页面了解完整的分辨率档位(从 0.25MP 到 4MP)以及其他模型的当前费率,因为价格可能会变动。

常见问题

图生图会改变产品的形状或 logo 吗? 如果你明确要求它不要改,就不会。在提示词开头明确指明哪些必须保持固定(形状、比例、logo),正是让这些元素保持稳定的原因——不明确说明是导致不想要偏移的最常见原因。

目录编辑应该使用什么分辨率? 1MP 对大多数网页列表和生活场景内容来说已经足够,并且能控制成本;只有对于会被紧密裁剪或打印的图片才升级到 2MP 或 4MP,因为每个档位的费用更高。

我可以一次性对整份目录运行此流程吗? 可以——上面的批量脚本就是这种模式:循环遍历 (image, prompt, output name) 元组,将每一项作为独立任务提交。并发运行少量请求,而不是一个巨大的顺序循环。

这与使用文生图从零生成产品有什么不同? 文生图从零开始,因此无法保证结果与现有产品的精确几何结构匹配。图生图从你真实照片开始,因此你没有要求更改的形状、logo 和比例会从构造上得到保留——这正是产品目录所需要的。

自己动手试试

一旦提示词被精确限定,上面的两项编辑各只需一次 API 调用。如果你已有产品照片,想在不重新拍摄的情况下生成生活场景或材质变体,hiapi 文档快速入门 会在几分钟内带你完成认证和第一次请求。

立即开始构建持久 AI 产物

获取 API 密钥,通过一个基于任务(task)的 API 调用图像、视频和音频模型。

阅读 API 文档