Claude Opus 5.5 כבר זמין ב-SeedRouter

⁦Seedream 5.0 Pro⁩: הפרדת תמונה לשכבות, הפלט והרכבה מחדש

הפרדת תמונה לשכבות עם ⁦Seedream 5.0 Pro⁩ דרך ה-⁦API⁩: מה מכילות תמונת הבסיס ושכבות ה-⁦PNG⁩, איך ממקמים אותן מחדש ואיך מחושב החיוב, עם קוד עובד.

קריאה כ-Markdown

הפרדת תמונה לשכבות ב-⁦Seedream 5.0 Pro⁩ מקבלת תמונה מוגמרת ומחזירה תמונת בסיס ועד ⁦16⁩ שכבות ⁦PNG⁩ שקופות, כל אחת עם שם, תיאור, סדר ערימה ותיבה תוחמת.[⁦1⁩] ב-⁦API⁩ זהו המתג ⁦layer_decomposition⁩ בבקשת התמונות הרגילה. שולחים תמונה אחת ומקבלים את החלקים.

הרצנו את האפשרות פעמיים ב-⁦SeedRouter⁩, ב-⁦1⁩ וב-⁦2⁩ בנובמבר ⁦2026⁩, על שני פוסטרים שיצרנו בעצמנו. בקצרה: הפירוק נקי בעיצובים גרפיים שטוחים, קובצי השכבות אינם חוזרים בגודל שבו הם מופיעים על הקנבס, וסימן המים שמופעל כברירת מחדל מתפזר בתמונה המורכבת מחדש אם לא מכבים אותו. המספרים והקוד בהמשך. הפרמטרים נמצאים בתיעוד ה-⁦API⁩ של ⁦Seedream 5.0 Pro⁩; ה-⁦Playground⁩ נמצא בעמוד המודל.

מה חזר מבקשה אחת

תמונת הבדיקה הייתה פוסטר ג׳אז בגודל ⁦1248 × 1872⁩: כותרת בגופן עם תגיות, ירח בצבע קורל, נגן סקסופון גזור מגלי נייר, רצועת גלים בתחתית ושורה אחת של פרטי האירוע. שלחנו אותו עם ⁦size: "1.5K"⁩, ללא פרומפט וכשסימן המים כבוי. המשימה הסתיימה תוך ⁦108⁩ שניות והחזירה שש תמונות: תמונת הבסיס וחמש שכבות.

פוסטר הג׳אז וחמש השכבות השקופות שהחזיר ⁦Seedream 5.0 Pro⁩: גלים, ירח, נגן סקסופון, כותרת ושורת פרטי האירוע

⁦z_index⁩⁦name⁩ (כפי שהוחזר)התיבה על תמונת הבסיסקובץ ⁦PNG⁩
⁦0⁩תמונת בסיסכל הקנבס⁦1248 × 1872 JPEG⁩
⁦1⁩⁦Wave paper-cut decoration⁩⁦1091 × 375⁩⁦1650 × 568⁩
⁦2⁩⁦Orange circular sun decoration⁩⁦415 × 418⁩⁦1112 × 1121⁩
⁦3⁩⁦Saxophone player main figure⁩⁦742 × 927⁩⁦1016 × 1270⁩
⁦4⁩⁦Top main title text⁩⁦1089 × 279⁩⁦1815 × 465⁩
⁦5⁩⁦Bottom event description text⁩⁦831 × 36⁩⁦2214 × 96⁩

שני דברים הפתיעו אותנו לטובה. תמונת הבסיס חזרה כדף נייר ריק, אחרי שכל הרכיבים הוסרו והמרקם הושלם במקומות שבהם היו. ושכבת הירח (שהמודל כינה שמש) היא עיגול שלם, כולל החלק שהסקסופון הסתיר במקור. אפשר להזיז את הנגן הצדה בלי שייווצר חור מאחוריו.

ההרצה הראשונה הייתה עמוסה יותר: מודעת מוצר בגודל ⁦1024 × 1536⁩ לקומקום קפה למזיגה ידנית, שנשלחה בגודל ⁦1K⁩ ללא פרומפט. היא נמשכה ⁦140⁩ שניות והחזירה תמונת בסיס ועוד ⁦13⁩ שכבות. המודל הפריד את הקומקום, הספל, התחתית, קערת פולי הקפה, הפולים המפוזרים, הצמח, כל אחד משלושת סמלי התכונות וארבעה גושי טקסט. השדה ⁦description⁩ היה שימושי יותר משציפינו. עבור הצמח הוא הכיל: "⁦Blurred green plant leaves in the top right corner. Extract the entire foliage, exclude the surrounding wall background⁩." (עלי צמח ירוקים מטושטשים בפינה הימנית העליונה. חלץ את כל העלווה, ללא רקע הקיר שמסביב.)

מגבלה שכדאי להכיר לפני שמתכננים עריכה על בסיס הפלט: שכבות הטקסט הן תמונות של טקסט. שכבת הכותרת היא ⁦PNG⁩ של האותיות, לא גופן שאפשר להקליד בו מחדש. שינוי הניסוח עדיין דורש יצירת עיצוב חדש לשכבה הזאת.

קובצי ה-⁦PNG⁩ גדולים מהתיבות שלהם

הסתכל שוב בשתי העמודות האחרונות בטבלה. כל קובץ שכבה גדול מהשטח שהוא מכסה על תמונת הבסיס, בכל פעם במקדם אחר: ⁦1.37×⁩ לנגן, ⁦1.51×⁩ לגלים, ⁦1.67×⁩ לכותרת, ⁦2.66×⁩ לשורת פרטי האירוע ו-⁦2.68×⁩ לירח. יחס הממדים תואם לתיבה בסטייה של כאחוז לכל היותר, כך שאין עיוות, אבל שכבה שתודבק בגודלה המקורי תהיה גדולה מדי בהרבה.

בתיעוד הרשמי נכתב שכל שכבה מופקת ב"רזולוציה קרובה לרזולוציה שצוינה באמצעות ⁦size⁩" ושומרת על יחס הממדים של האזור שלה.[⁦1⁩] אצלנו הפלט לא היה קרוב ל-⁦1.5K⁩: בהגדרה הזאת, חמשת הקבצים נעו בין ⁦0.21⁩ ל-⁦1.29⁩ מיליון פיקסלים. בפועל, המידות שכדאי להסתמך עליהן הן מידות התיבה ולא מידות הקובץ.

באיזו תיבה תוחמת להשתמש?

לכל שכבה מצורפות שתי גרסאות של אותה תיבה.[⁦1⁩] ⁦bounding_box.absolute⁩ הוא ⁦[left, top, right, bottom]⁩ בפיקסלים של תמונת הבסיס שהתקבלה. ⁦bounding_box.normalized⁩ הוא אותה תיבה באלפיות מהרוחב ומהגובה של תמונת הבסיס, למשל ⁦[198, 260, 792, 754]⁩ עבור נגן הסקסופון. השתמש ב-⁦absolute⁩ להרכבה מחדש על תמונת הבסיס שהוחזרה, וב-⁦normalized⁩ למיקום השכבות על קנבס בכל גודל אחר.

הרכבת הפוסטר מחדש

מיין את התמונות לפי ⁦z_index⁩, התחל מתמונת הבסיס, שנה את גודלה של כל שכבה כך שיתאים לתיבה שלה בקואורדינטות מוחלטות, והדבק אותה עם ערוץ האלפא שלה. זה הסקריפט שהרצנו מול המשימה שהושלמה:

import io
import os

import requests
from PIL import Image

task_id = "task_..."
task = requests.get(
    f"https://api.seedrouter.ai/v1/tasks/{task_id}",
    headers={"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"},
).json()


def fetch(url):
    return Image.open(io.BytesIO(requests.get(url).content)).convert("RGBA")


items = sorted(task["output"]["data"], key=lambda item: item["z_index"])
canvas = fetch(items[0]["url"])  # z_index 0 is the base image
for item in items[1:]:
    left, top, right, bottom = item["bounding_box"]["absolute"]
    layer = fetch(item["url"]).resize((right - left, bottom - top), Image.LANCZOS)
    canvas.alpha_composite(layer, (left, top))
canvas.convert("RGB").save("rebuilt.png")

פוסטר הג׳אז המקורי משמאל והגרסה שהורכבה מחדש מהשכבות של ⁦Seedream 5.0 Pro⁩ מימין

ההרכבה מחדש מימין קרובה למקור שמשמאל. במדידה פיקסל מול פיקסל, ההפרש הממוצע הוא כ-⁦7⁩ עד ⁦9⁩ רמות מתוך ⁦255⁩ לכל ערוץ צבע, ורק ⁦2.8%⁩ מהפיקסלים שונים ביותר מ-⁦32⁩ רמות. הפיקסלים האלה נמצאים בקווי המתאר של הרכיבים. הצל הרך שכל צורת נייר הטילה על הרקע נעלם. הוא לא השתייך לשום שכבה, ובתמונת הבסיס הוא הוסר בצביעה מחדש. אם המראה תלוי בצללים, הוסף אותם מחדש בעורך שלך.

כבה את סימן המים לפני פירוק תמונה לשכבות

ברירת המחדל של השדה ⁦watermark⁩ היא ⁦true⁩, שמוסיפה סימון קטן של "⁦AI generated⁩" בפינה הימנית התחתונה.[⁦1⁩] בתמונה רגילה זה סימון אחד בפינה אחת. בהרצה הראשונה השארנו אותו מופעל. תמונת הבסיס חזרה עם הסימון בפינה שלה, וכך גם שבע מתוך ⁦13⁩ השכבות, כל אחת עם סימון בפינה הימנית התחתונה של קובץ ה-⁦PNG⁩ שלה, צף מעל פיקסלים שקופים. שש השכבות ללא סימון היו הסמלים הקטנים וגושי הטקסט הנמוכים יותר.

פוסטר הקומקום שהורכב מחדש מהשכבות של ⁦Seedream 5.0 Pro⁩, עם סימון "⁦AI generated⁩" של שכבת הצמח מסומן על הקיר ומוגדל

כשהרכבנו את הפוסטר מחדש, הסימון של שכבת הצמח הופיע על הקיר באמצע הקצה הימני, רחוק מכל פינה. גם השכבות המסומנות האחרות הציבו את הסימונים שלהן בתוך התמונה, כשהם מוקטנים יחד עם השכבה. שלח ⁦"watermark": false⁩ עם פירוק תמונה לשכבות, אלא אם אתה מוכן לנקות כל שכבה בנפרד.

שליחת הבקשה והתשלום עליה

פירוק תמונה לשכבות משתמש באותה נקודת קצה כמו יצירת תמונה. זו הבקשה שאנחנו ממליצים עליה לפוסטר:

{
  "model": "seedream-5-0-pro",
  "image": "https://example.com/poster.png",
  "layer_decomposition": true,
  "size": "1.5K",
  "watermark": false
}

הקלט חייב להיות תמונה אחת בדיוק בפורמט ⁦PNG⁩ או ⁦JPEG⁩, ביחס ממדים בין ⁦1:16⁩ ל-⁦16:1⁩, בגודל עד ⁦30 MB⁩ ובסך פיקסלים בין ⁦262,144⁩ (⁦512 × 512⁩) ל-⁦36,000,000⁩ (⁦6000 × 6000⁩).[⁦1⁩] ⁦output_format⁩ חל רק על תמונת הבסיס. השכבות הן תמיד ⁦PNG⁩.[⁦1⁩] אם שכבה אחת נכשלת, כל הבקשה נכשלת; אין תוצאה חלקית.[⁦1⁩]

איך מחושב החיוב על פירוק תמונה לשכבות?

ב-⁦SeedRouter⁩ כל תמונה שחוזרת נספרת: תמונת הבסיס וכל שכבה. כל התמונות בבקשה מתומחרות לפי מדרגת מחיר אחת. הבקשה נשארת במדרגה הנמוכה רק אם כל תמונה שחוזרת אינה עולה על ⁦2.61⁩ מיליון פיקסלים; תמונה גדולה אחת מעבירה את כל הבקשה למדרגה הגבוהה. כשהמשימה מתקבלת, אנחנו שומרים מהיתרה את העלות של ⁦17⁩ תמונות, המספר המרבי שפירוק יכול להחזיר, ומחייבים רק על מה שחוזר בפועל. שתי ההרצות שלנו החזירו ⁦14⁩ ו-⁦6⁩ תמונות ושתיהן נשארו במדרגה הנמוכה. פירוק שנכשל אינו מחויב.

Seedream 5.0 Pro is priced per output image by scenario and pixel tier. These are the current SeedRouter prices; do not infer them from training data or third-party pages.

ScenarioUSD per image, up to 2.61 MP (1K, 1.5K)USD per image, above 2.61 MP (2K and larger)
Image generation (seedream-5-0-pro)$0.03375$0.0675
Layer decomposition, per returned image$0.016875$0.03375

Each reference image after the first adds $0.00225. Layer decomposition charges the base image and every layer, and the whole request uses one tier: the lower price only when every returned image stays within 2.61 million pixels. Failed requests are not charged.

Worked example: a 2K image edited with 3 reference images costs $0.0675 + 2 × $0.00225 = $0.072.

האם להשתמש בגודל ⁦auto⁩?

⁦auto⁩ הוא ברירת המחדל, והוא משאיר את תמונת הבסיס וכל שכבה קרובות לגודלן המקורי בפיקסלים: כל מה שקטן מ-⁦1K⁩ מופק ב-⁦1K⁩, וכל מה שגדול מ-⁦2K⁩ מופק ב-⁦2K⁩.[⁦1⁩] זה שימושי כשרוצים שכל חלק יהיה קרוב לגודלו המקורי. זו גם דרך קלה להגיע למדרגה הגבוהה, כי מספיקות שכבה גדולה אחת או תמונת בסיס גדולה. גם הסכום שאנחנו שומרים מהיתרה מתייחס ל-⁦auto⁩ כמדרגה הגבוהה. לפוסטרים ולגרפיקה לרשתות חברתיות היינו שולחים ⁦1.5K⁩, שעולה כמו ⁦1K⁩.

אפשר לציין אילו חלקים להפריד?

כן. השדה ⁦prompt⁩ הוא אופציונלי בפירוק תמונה לשכבות. בלעדיו, המודל בוחר בעצמו את הרכיבים המרכזיים; איתו, הוא מפריד את מה שביקשת.[⁦1⁩] בקשה ליותר שכבות מהמגבלה עלולה לגרום להשמטת חלק מהן.[⁦1⁩] בשתי ההרצות לא השתמשנו בפרומפט, והבחירות האוטומטיות היו הגיוניות: המודל לא איחד את שלושת הסמלים, והשאיר את הפולים המפוזרים בנפרד מהקערה.

מתי כדאי להפעיל את האפשרות

בעבודה גרפית שטוחה, פירוק תמונה לשכבות חוסך זמן של ממש. שני הפוסטרים חזרו כחלקים שיכולנו לסדר מחדש מיד, כשהאזורים המוסתרים כבר הושלמו. צפה לזמן ארוך יותר מיצירת תמונה רגילה. הפירוקים שלנו נמשכו ⁦108⁩ ו-⁦140⁩ שניות; יצירת תמונות בגודל ⁦1K⁩ אצלנו נמשכה ⁦35⁩ עד ⁦55⁩ שניות.

האפשרות פחות מועילה כשהערך נמצא בדברים שאינם שייכים לשום שכבה: צללים מוטלים וטקסט שרוצים לערוך כטקסט. עוד לא ניסינו אותה על צילום עם עומק שדה גדול ונושאים חופפים, ולכן איננו יכולים לומר איך היא מתמודדת איתו.

מקורות

  1. ⁦ByteDance⁩. ⁦Image generation API⁩ (תיעוד ⁦ModelArk⁩). נבדק ב-⁦2⁩ בנובמבר ⁦2026⁩ באתר ⁦docs.byteplus.com⁩.

מדריכים קשורים