COMFYUI 基礎 · 第 07 課

圖片不要被拉扁:等比例縮放與置中裁切

用三個內建節點完成 600 像素寬圖片與正方形版本,理解 height=0、crop disabled/center 的差別,附原創測試 PNG、工作流與觀察單。

  • 入門實作
  • 約 20–30 分鐘 · 閱讀與練習
  • 發布

開始前,準備這些

  • 已有可啟動的 ComfyUI,會匯入 JSON 與選擇圖片
  • 能查看下載圖片的像素寬高;不需要生成模型

這一課,你會學會

  • 使用 ImageScale 保留圖片比例
  • 辨認拉伸與置中裁切的代價
  • 保存三個版本並檢查真正的輸出尺寸
本課目錄

圖修好了,為什麼放進正方形封面就變扁?

第六課練習改一小塊內容;這課處理交付前常見的一步:尺寸換了,主角不要跟著變形。同一張橫圖,做成文章插圖可以保留全景,做成方形封面卻可能必須裁掉兩側。把寬高都填成 600,不會自動替你選好。

先開啟官方 ComfyUI 使用入口、官方節點操作說明及官方放大教學。已裝好的人直接使用原有環境;本課只用內建圖片處理節點,不要求購買服務、下載模型或安裝外掛。官方放大教學另介紹模型增強,本課先把像素尺寸處理做好。

下載本課三節點工作流與1200×800 測試 PNG。測試圖中央是一個圓形,兩側有 LEFT、RIGHT 標記,方便看出變形和裁切。所有圖都是本站原創幾何示意,不是產品截圖,也不是 ComfyUI 實跑成果;沒有使用 AI 生成圖片。

原創1200乘800格線測試圖,中央綠色圓形,左右各有色塊及LEFT與RIGHT標記
本站原創測試素材。中央圓形檢查比例,左右標記檢查是否被裁掉;每格為100像素。可點圖取得原始 PNG。

第 1 步:另開工作流,先確認選的是對的節點

在 ComfyUI 的 Workflow → Open 匯入 lesson-07-resize.json。檔案不會替你上傳來源圖:在 Load Image(載入圖片) 選取剛下載的 resize-test.png,應看到上面的圓與左右標記。

若要自己接,在畫布空白處雙擊搜尋節點,依序加入 Load Image、Upscale Image、Save Image(儲存圖片)。Upscale Image 的類型是 ImageScale;翻譯名稱可能不同,以欄位 upscale_method、width、height、crop 為準。不要誤選 Upscale Image By,後者主要是 scale_by 倍率欄位;也不要選需要 upscale_model 的模型放大節點。

連線只有兩條:Load Image 的 IMAGE → Upscale Image 的 image,再把其 IMAGE → Save Image 的 images。MASK 留空。這裡沒有文字提示、seed、KSampler 或 checkpoint,因為我們是在調整已有圖片的像素排列。

三節點原創接線示意:Load Image經IMAGE連到Upscale Image,再連到Save Image
本站原創接線示意,非 ComfyUI 介面截圖。每條線都傳 IMAGE;沒有模型載入或取樣器。

應該看到: 三個節點、兩條 IMAGE 連線、Load Image 已顯示來源縮圖。紅色缺節點或圖片找不到時先處理,不急著按 Run。JSON 已做格式與接線檢查,尚未實際在 ComfyUI 匯入,介面版本差異仍需留意。

第 2 步:做一張寬 600、比例不變的 A 圖

在 Upscale Image 設 upscale_method = bicubic、width = 600、height = 0、crop = disabled。Save Image 的 filename_prefix 保持 greenbean-lesson07-A,另存工作流為自己的 lesson07-A.json,按 Run 一次。

這裡 height = 0 不是輸出零高度。官方 ImageScale 在一邊為零時,會用來源比例算另一邊:800 × 600 ÷ 1200 = 400。預期輸出是 600×400,圓仍是圓,兩側標記都留下。寬高都為零則保留原尺寸,不代表自動挑選最佳尺寸。

完成後下載 Save Image 的 PNG,使用檔案資訊或圖片編輯器看像素尺寸。不要只看瀏覽器顯示寬度:網頁可能把大圖縮小顯示,並沒有改變原檔像素。將實際寬高填入觀察單 CSV,未執行就保留 not_run,不預填成功。

第 3 步:只改高度,觀察 B 圖為何變形

保持同一張來源、bicubic 與 crop = disabled,將 height 改為 600。輸出前綴換成 greenbean-lesson07-B,另存 B 工作流並執行。

現在寬高都指定,預期輸出 600×600。disabled 的意思是「不先裁切」,不是「鎖定比例」。原圖的水平縮成一半、垂直縮成四分之三,圓會變成較高的橢圓。左右內容還在,但形狀改了。人像、商品和文字版面通常不希望這樣變形。

原創三圖對照:A等比例600乘400保留圓形,B拉伸600乘600變橢圓,C置中裁切600乘600保留圓形但失去兩側
原創幾何對照,由 Python 繪製,供觀察比例及構圖。不是本課 ComfyUI 實跑截圖,插值像素不保證與節點輸出相同。

第 4 步:只切換 crop,做正方形 C 圖

仍從原始 1200×800 PNG 出發,保留 width = 600、height = 600、bicubic,只將 crop 改為 center。輸出前綴換成 greenbean-lesson07-C,另存 C 工作流後執行。

此設定先取來源中央符合目標比例的範圍,再縮放。本例會從左右各去掉 200 像素,留下中央 800×800,最後縮成 600×600。圓形比例保住了,LEFT/RIGHT 兩側標記卻會消失。這是取捨,不是工具故障。

原創置中裁切示意,紅框保留1200乘800來源中央800乘800,左右各裁200像素,再縮至600乘600
本例的數學示意。不同來源比例會得到不同裁切量,不能把「左右各200」套到所有圖片;裁切置中也不等於會辨識人臉或重要物件。

應該看到: B、C 的檔案尺寸都是 600×600,C 的圓形不被拉長,但畫面左右變少。若主角在角落,center 可能裁到主角;應回到來源重新構圖,或另做留白版,不要一直換插值方法期待物件回來。本課不把補白或 AI 擴圖混進同一次比較。

第 5 步:依用途選擇,別把更多像素當成更多真實細節

把 A、B、C 放在相同顯示倍率檢查:像素寬高、圓形比例、兩側標記各看一次。文章插圖要保留全部內容,可選 A;固定方形版位且中央構圖足夠,可選 C;B 用來認識拉伸,不作預設交付。

這個節點雖叫 Upscale Image,也可以縮小圖片。把 width 改大並不會啟動 AI 細節修復;bicubic 是像素重採樣方法。真要補紋理時才另研究模型放大,並檢查臉、文字與產品標誌是否被改寫。寬高都變兩倍,像素數是四倍,檔案大小與記憶體用量則還受編碼等因素影響,不能直接保證也是四倍。

卡住時,按現象排查

  • 匯入 JSON 後來源空白:重新在 Load Image 上傳並選取 PNG;JSON 不含來源像素
  • 找不到 width/height:檢查是否選成 Upscale Image By 或模型放大節點
  • height=0 卻得到正方形:確認實際執行的是 A 工作流,且讀取的是新輸出,不是上一張 B
  • 主角被切掉:center 會以幾何中心裁切,不做主體追蹤;回到來源與構圖處理
  • 想保留透明背景:這課測試圖是 RGB,MASK 沒接,沒有驗證透明通道保存;不要直接套用在透明貼圖交付
  • 輸出沒有出現:確認最後接的是 Save Image 且已執行完成,記下完整錯誤;不要為此額外下載生成模型

小練習與答案

  1. 來源 1200×800,width=900、height=0,預期多大?900×600
  2. 600×600、crop disabled 會自動保留比例嗎?不會,兩邊都指定時會按指定尺寸縮放
  3. B 與 C 都是600×600,能只看檔案尺寸就判定沒有變形嗎?不能,還要檢查形狀與保留下來的構圖
  4. center 會保護左邊的文字嗎?不會,它按比例置中裁切
  5. 主角在左側,又必須交方形圖,center 一定適合嗎?不一定,可能裁掉主角;先重新構圖,或另做留白版,避免直接拉伸

完成時保留 A/B/C 三張 PNG、各自 JSON 和填好的 CSV。可再用自己有權使用的照片重做一次,先預測哪個邊緣會被裁,再看實際結果。

下載與查核來源

查核日期:2026年10月10日(台灣)。本課以固定版本官方程式碼核對欄位、連線和尺寸算法;原創示意及測試素材採 CC0。尚未在 ComfyUI 介面匯入或執行,不宣稱特定硬體速度、介面相容性或 GPU 測試通過。