0

สร้างภาพสินค้าด้วย AI สำหรับ E-Commerce ด้วย OpenAI API และ GPT Image 2.5

เคยเจอไหมครับ ของชิ้นเดียวแต่ต้องถ่ายภาพใหม่ทุกสี ทุกแคมเปญ จะยิงแอดทีก็ขอภาพใหม่อีกที บทความนี้แอดจะพาเพื่อน ๆ สร้างภาพสินค้าด้วย AI แบบทำได้จริง ผ่าน AI Product Image Pipeline ด้วย OpenAI API กับ GPT Image 2.5 โดยยึดหลักเดียวคือ Generate Product Once → Reuse Everywhere ปั้นสินค้าครั้งเดียว แล้วใช้ซ้ำให้คุ้มที่สุด

💡 ถ้าอยากได้ระบบ AI สร้างภาพสินค้า แบบนี้ไปใช้กับร้านหรือแบรนด์ของคุณเลย ทีม BorntoDev รับทำระบบสร้างภาพสินค้า AI ให้ครบตั้งแต่ Prompt, Pipeline จนถึงหน้าเว็บ หรือถ้าอยากให้ทีมทำเองได้ เราก็ รับสอนแบบ In-house ให้ทั้งองค์กรครับ (รายละเอียดอยู่ท้ายบทความ)

สิ่งที่เราจะสร้าง

แบรนด์สมมติของเราชื่อ NORTHLINE (Everyday Carry) คอลเลกชัน Basecamp 01 มีของอยู่ 3 ชิ้น

  • Loop Hoodie : Hoodie
  • Field Tote : Tote Bag
  • Grid Case : Phone Case

ปลายทางคือ Demo App (React + Express) ที่ทำครบทุก Use Case ตั้งแต่กดสร้างภาพ ยันขึ้นหน้าเว็บจริง

สร้างภาพสินค้าด้วย AI - หน้า Hero ของ Demo App AI Product Studio

รูปที่ 1 หน้า Hero ของ Demo App พื้น #fafaf8 ตัวอักษรดำ ไม่มี Gradient


Architecture Overview

User → React → Express API → OpenAI API → GPT Image 2.5
     → Product Assets ─┬─ Gallery / Product Detail
                       ├─ Campaign Banner / Landing Page
                       └─ Social Content
Plaintext

ย้ำจุดเดียวครับ API Key อยู่ฝั่ง Backend เท่านั้น อย่าเผลอโยนไปไว้ฝั่ง Frontend เพราะใครเปิด DevTools ก็เห็น

client/src/components/   # Gallery, Generator, CampaignSwitcher, ReferenceUploader
server/routes/images.js
server/services/openai-image.service.js
generated/{products,transparent,variants,campaigns}/
Plaintext

Setup OpenAI API

npm i openai express multer dotenv

# .env
OPENAI_API_KEY=sk-...
IMAGE_MODEL=gpt-image-2.5-flare
Bash

GPT Image 2.5 มีให้เลือกสองตัว gpt-image-2.5-flare เร็ว เหมาะกับตอนนั่ง iterate ลองไปเรื่อย ๆ ส่วน gpt-image-2.5-sunburst คุณภาพสูงกว่า เก็บไว้ใช้ตอนทำ Final แอดแนะนำให้เก็บชื่อโมเดลไว้ใน env จะได้สลับโดยไม่ต้องไล่แก้โค้ด

// server/services/openai-image.service.js
import OpenAI, { toFile } from "openai";
import fs from "node:fs/promises";

const client = new OpenAI(); // อ่าน OPENAI_API_KEY จาก env
const MODEL = process.env.IMAGE_MODEL;
const toBuffer = (res) => Buffer.from(res.data[0].b64_json, "base64");
JavaScript

Generate Product Image

Prompt ที่ดีต้องบอกให้ครบว่า Product Type, Shape, Material, Color, Surface, Angle, Lens, Lighting, Background, Composition และ Style เป็นแบบไหน ส่วน Size กับ Quality ปล่อยเป็นหน้าที่ของ parameter เขียนกำกวมเมื่อไหร่ โมเดลเดาเองทันที

NORTHLINE Loop Hoodie, oversized pullover, brushed cotton fleece,
washed charcoal, white embroidered "N" on left chest. Front view,
85mm lens, soft light from left, light grey seamless background,
centered, 10% padding, clean catalog style, no props.
export async function generateProduct({ prompt, transparent, size = "1024x1536" }) {
  const res = await client.images.generate({
    model: MODEL,
    prompt,
    size,
    quality: "high",
    output_format: "png",
    background: transparent ? "transparent" : "opaque",
  });
  return toBuffer(res); // Base64 → Buffer
}

export async function saveImage(buffer, folder, name) {
  const file = `generated/${folder}/${name}-${Date.now()}.png`;
  await fs.writeFile(file, buffer);
  return file;
}
Plaintext
รูปที่ 2 Product Generator ประกอบ Prompt จากฟิลด์สินค้า แล้วเรียก gpt-image-2.5-flare ได้ภาพจริงกลับมา
รูปที่ 2 Product Generator ประกอบ Prompt จากฟิลด์สินค้า แล้วเรียก gpt-image-2.5-flare ได้ภาพจริงกลับมา

Generate Transparent Product Asset

Transparent PNG ดีตรงที่วางได้ทุกที่ครับ Product Card, Hero Banner, Marketplace Listing, Seasonal Campaign ยัน Ad Creative ใช้ไฟล์เดียวจบ

แต่มีกับดักอยู่ Prompt มีผลเหนือ parameter ถ้าเราเผลอบรรยายฉาก (studio, floor, shadow) ก็มีสิทธิ์ได้พื้นหลังติดมา ทั้งที่ส่ง background: “transparent” ไปแล้ว เพราะงั้นเขียนแบบ Isolated ไปเลย

NORTHLINE Field Tote, natural canvas, black webbing straps, front view,
single isolated product, fully padded in frame, fully transparent
background, no backdrop, no floor, no shadow, no text, no watermark.
const png = await generateProduct({ prompt: totePrompt, transparent: true, size: "1024x1024" });
await saveImage(png, "transparent", "field-tote");
Plaintext

ก่อนเอาไปใช้ เช็ค Alpha Channel สักนิดครับ (ใช้ Pillow)

from PIL import Image

img = Image.open("field-tote.png")
assert img.mode == "RGBA", "ไม่มี Alpha Channel"
clear = img.getchannel("A").histogram()[0]
print(f"transparent: {clear / (img.width * img.height):.0%}")
Python

ถ้าได้ 0% แปลว่าพื้นหลังไม่โปร่งใส กลับไปแก้ Prompt ใหม่ ของแอดรอบนี้วัดได้ 43% ถึง 58% ถือว่าผ่าน

รูปที่ 3 Product Gallery ใช้ Transparent PNG ไฟล์เดียวต่อ SKU วางบนพื้นหลังของ Variant (ทั้งสามไฟล์ผ่าน Alpha Check 43% ถึง 58%)
รูปที่ 3 Product Gallery ใช้ Transparent PNG ไฟล์เดียวต่อ SKU วางบนพื้นหลังของ Variant (ทั้งสามไฟล์ผ่าน Alpha Check 43% ถึง 58%)

Generate from Reference Image

Upload hoodie-reference.jpg → Frontend → Backend (multipart)
  → Reference Image + Prompt → OpenAI API → GPT Image 2.5
  → Generated Product Image → E-Commerce Website
Plaintext

ฝั่ง Service เขียนแบบนี้

export async function editFromReference(file, prompt, opts = {}) {
  const image = await toFile(file.buffer, file.originalname, { type: file.mimetype });
  const res = await client.images.edit({
    model: MODEL, image, prompt, quality: "high", output_format: "png", ...opts,
  });
  return toBuffer(res);
}
JavaScript

ส่วน Route ที่รับ multipart

// server/routes/images.js
const upload = multer({ storage: multer.memoryStorage(), limits: { fileSize: 10e6 } });

router.post("/reference", upload.single("reference"), async (req, res) => {
  const { prompt, campaign } = req.body;
  const png = await editFromReference(req.file, `${campaign} campaign. ${prompt}`);
  res.json({ url: "/" + (await saveImage(png, "campaigns", campaign)) });
});
JavaScript

ข้อสำคัญคือ Prompt ต้องแยกให้ชัดว่าอะไรล็อก อะไรเปลี่ยนได้

Keep exactly: hoodie shape, silhouette, fabric, main color, logo and
graphic position. Change only: background, lighting, composition, mood.
Plaintext
รูปที่ 4 Reference Uploader มี Drag & Drop, Preview, Campaign และ Prompt ที่ล็อกตัวสินค้า

รูปที่ 4 Reference Uploader มี Drag & Drop, Preview, Campaign และ Prompt ที่ล็อกตัวสินค้า
รูปที่ 5 ผลลัพธ์จาก images.edit รูปทรง ผ้า สี และตำแหน่งโลโก้คงเดิม เปลี่ยนเฉพาะฉากกับแสง

รูปที่ 5 ผลลัพธ์จาก images.edit รูปทรง ผ้า สี และตำแหน่งโลโก้คงเดิม เปลี่ยนเฉพาะฉากกับแสง

Generate Product Variants

ใช้ Reference ตัวเดิม เปลี่ยนแค่สี วนลูปเอาเลย

for (const color of ["black", "grey", "navy", "cream"]) {
  const png = await editFromReference(file,
    `Recolor only the hoodie fabric to ${color}. Keep shape, stitching,
     logo color and placement identical. Isolated product.`,
    { background: "transparent" });
  await saveImage(png, "variants", `loop-hoodie-${color}`);
}
JavaScript

Phone Case กับ Tote ก็ใช้ลูปเดียวกันครับ แต่บอกตรง ๆ ว่า AI ยังรักษารายละเอียดได้ไม่ 100% ตะเข็บเพี้ยน โลโก้ขนาดไม่เท่าเดิม ลายเลื่อน เจอได้หมด ทุก Variant เลยต้องผ่านสายตาคนก่อน Publish เสมอ

Reuse Product Across Campaigns

loop-hoodie.png ไฟล์เดียวใช้ได้ทุก Campaign เปลี่ยนแค่ Background, Layout, Typography, Color Theme กับ Copy

export const CAMPAIGNS = {
  studio: { bg: "#f4f4f2", ink: "#111", copy: "Everyday layers" },
  summer: { bg: "#f6e7c8", ink: "#3a2a10", copy: "Light for long days" },
  street: { bg: "#1d1d1d", ink: "#eee", copy: "Built for the city" },
  blackfriday: { bg: "#000", ink: "#ffd400", copy: "30% off" },
};
JavaScript

อยากได้ Back to School หรือ New Collection ก็แค่เพิ่ม key เข้าไป ได้ทั้งลดค่า API, Shape ไม่เพี้ยนข้าม Campaign และใช้ Asset ชุดเดียวทุก Channel มุมแอดมองว่าตรงนี้แหละคือจุดที่ประหยัดงบจริง งานที่เคยต้องจ้างถ่ายใหม่ทุกแคมเปญ เหลือแค่แก้ค่าในออบเจ็กต์

รูปที่ 6 Campaign Studio จากไฟล์ loop-hoodie.png
รูปที่ 6 Campaign Studio จากไฟล์ loop-hoodie.png
รูปที่ 7 Campaign Summer เปลี่ยนแค่ Background, Typography และ Copy
รูปที่ 7 Campaign Summer เปลี่ยนแค่ Background, Typography และ Copy
รูปที่ 8 Campaign Street ใช้ Asset ไฟล์เดิม Shape ไม่เพี้ยน
รูปที่ 8 Campaign Street ใช้ Asset ไฟล์เดิม Shape ไม่เพี้ยน
รูปที่ 9 Campaign Black Friday แค่เพิ่ม key ใหม่ใน CAMPAIGNS
รูปที่ 9 Campaign Black Friday แค่เพิ่ม key ใหม่ใน CAMPAIGNS

Build Product Mockup

Generate Graphic → Transparent PNG → Blank Product
  → Resize / Position → Composite → Product Mockup
Plaintext

Generate กราฟิก “line-art mountain badge ‘BASECAMP 01’, isolated” ด้วย transparent: true แล้วค่อย Composite ทับเสื้อเปล่า

from PIL import Image

tee = Image.open("blank-tee.png").convert("RGBA")
art = Image.open("basecamp-badge.png").convert("RGBA")
art = art.crop(art.getchannel("A").getbbox())   # ตัดขอบใส
art.thumbnail((int(tee.width * 0.32),) * 2)     # กว้าง ~32% ของเสื้อ
pos = ((tee.width - art.width) // 2, int(tee.height * 0.28))
tee.alpha_composite(art, pos)
tee.save("mockup-tee-basecamp.png")
Python

Hoodie กับ Tote ใช้กราฟิกตัวเดิมได้เลย ปรับแค่สัดส่วน (เอะ..ง่ายไปไหมเนี่ย ฮ่า ๆ)

Build Minimal E-Commerce Demo

หน้าเว็บมีของพวกนี้ครับ

  • Hero: “AI Product Studio” + CTA “Try Product Studio”
  • Product Gallery: Image, Name, Category, Color Variant
  • Campaign Switcher: Studio, Summer, Street, Black Friday
  • Reference Uploader: Drag & Drop, Preview, Prompt, Style, Result
  • Product Generator: ฟิลด์สินค้า + Transparent Toggle + Prompt Preview

ดีไซน์เอาเรียบ ๆ พื้น #fafaf8 ตัวอักษรดำ เว้นที่ว่างเยอะ ไม่มี Gradient ปล่อยให้ตัวสินค้าเด่นแทน

// routes/images.js (index.js mount ที่ /api/images + static /generated)
router.post("/generate", async (req, res) => {
  const { prompt, transparent } = req.body;
  const png = await generateProduct({ prompt, transparent });
  const dir = transparent ? "transparent" : "products";
  res.json({ url: "/" + (await saveImage(png, dir, "product")) });
});
JavaScript

Campaign Switcher ที่ใช้ Asset ไฟล์เดิม

export function CampaignSwitcher() {
  const [key, setKey] = useState("studio");
  const c = CAMPAIGNS[key];
  return (
    <section className="hero" style={{ background: c.bg, color: c.ink }}>
      {Object.keys(CAMPAIGNS).map((k) => (
        <button key={k} aria-pressed={k === key} onClick={() => setKey(k)}>{k}</button>
      ))}
      <h2>{c.copy}</h2>
      <img src="/generated/transparent/loop-hoodie.png" alt="Loop Hoodie" />
    </section>
  );
}
JSX

ฝั่ง Frontend ต่อ API แบบนี้

export const buildPrompt = (f) =>
  `${f.name} ${f.type}, ${f.material}, ${f.color}, ${f.angle}, ${f.style}. ` +
  (f.transparent ? "Isolated, transparent background, no shadow." : `${f.background} background.`);

export async function generateFromReference(file, prompt, campaign) {
  const form = new FormData();
  form.append("reference", file);
  form.append("prompt", prompt);
  form.append("campaign", campaign);
  const res = await fetch("/api/images/reference", { method: "POST", body: form });
  return (await res.json()).url;
}
JavaScript

Drop zone อ่านไฟล์จาก e.dataTransfer.files[0] แล้ว Preview ด้วย URL.createObjectURL(file) ส่วน Vite ตั้ง server.proxy ให้ /api ชี้ไป Express ไม่งั้นเจอ CORS แน่นอน

รูปที่ 10 Product Generator มีฟิลด์สินค้า, Transparent Toggle และ Prompt Preview ที่อัปเดตแบบ Live
รูปที่ 10 Product Generator มีฟิลด์สินค้า, Transparent Toggle และ Prompt Preview ที่อัปเดตแบบ Live

Production Considerations

  • Security: API Key อยู่ใน env ฝั่ง Backend ซึ่งเป็น Proxy ที่ตรวจ file type/size, auth และ rate limit
  • Storage & CDN: Object Storage + CDN ตั้งชื่อ {sku}-{variant}-{campaign}-v{n}.png
  • Cache & Cost: hash(prompt + params + reference) เป็น cache key
  • Latency & Rate Limit: ใช้ Job Queue + retry with backoff
  • Optimization: เก็บ PNG เป็น Master เสิร์ฟ WebP (มี Alpha) ส่วน Reference Image เก็บ private ผูกกับ SKU
  • Product Accuracy (ข้อนี้สำคัญสุด) : ห้าม Publish อัตโนมัติเด็ดขาด ต้องตรวจ Logo, Shape, Pattern, Material, Stitching, Color, Graphic Placement, Proportion และ Dimensions เทียบของจริงทุกครั้ง ภาพที่ไม่ตรงกับสินค้าจริงคือเรื่องใหญ่ ลูกค้าเข้าใจผิดแล้วจบที่รีวิวหนึ่งดาว ใช้สถานะ draft → approved → published กันไว้ก่อน

และนี่ก็เป็นตัวอย่างการทำ Transparent Asset ที่ generate ครั้งเดียวแล้วใช้ซ้ำ, Reference Image ที่รักษาตัวตนของสินค้าไว้ และ Human Review ที่การันตีว่าภาพตรงกับของจริง แต่บทความนี้แอดอยากสื่อถึงวิธีการทำ แต่ไม่ได้สนับสนุนให้สร้างของปลอม อย่างเช่น เมนูอาหาร สินค้าปลอมนะคร้าบบบ

อยากสร้างภาพสินค้าด้วย AI ให้แบรนด์ของคุณ? BorntoDev รับทำ และรับสอน

ถ้าอ่านจบแล้วรู้สึกว่า “อยากได้แบบนี้ แต่ไม่มีเวลาทำเอง” หรือ “อยากให้ทีมทำเป็น” BorntoDev ช่วยได้ทั้งสองแบบครับ

  • รับทำระบบสร้างภาพสินค้า AI – ออกแบบ Prompt และ Pipeline สร้างภาพสินค้า E-Commerce, Transparent PNG, Variant สินค้าหลายสี และภาพแคมเปญโฆษณา พร้อมเชื่อมเข้ากับเว็บหรือระบบหลังบ้านของคุณ
  • รับสอนสร้างภาพสินค้าด้วย AI (In-house Training) – Workshop ให้ทีม Marketing, Content และ Developer ใช้ AI สร้างภาพสินค้า ใช้ OpenAI API และ GPT Image ได้เองตั้งแต่พื้นฐานจนถึงขึ้นระบบจริง
  • คอร์สออนไลน์ AI และการเขียนโปรแกรม – เรียนรู้ด้วยตัวเองได้ทุกที่ที่ BorntoDev School

Reference : OpenAI Cookbook Transparent image assets

0

แนะนำสำหรับคุณ

คัดลอกลิงก์สำเร็จ

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า