這筆帳的入口:格子全是正方形
同一批照片進方格,橫著拍的被裁掉 25%,豎著拍的被裁掉 43.75%,正方形構圖一點沒動。差異不在模板——7 個模板(templates 陣列 line 86-94)的格子全是正方形,slotRatio 恆為 1:形狀類 line 305 的 pw/ph 相等,網格類 line 340 的 300/300。被裁的百分比只與源圖長寬比有關,模板之間只差目標邊長,網格類恆 300、預設形狀類 592。
橫、豎、方各丟多少
裁切分支在 line 343-347:橫圖沿寬左右各裁,豎圖沿高上下各裁,方圖不需要偏移。
| 源圖 | 保留邊 | 偏移量 | 保留 | 丟掉 | 丟掉的像素 |
|---|---|---|---|---|---|
| 4032×3024 | 3024×3024 | sx 504 | 75% | 25% | 3,048,192 |
| 1080×1920 | 1080×1080 | sy 420 | 56.25% | 43.75% | 907,200 |
| 640×640 | 640×640 | sx/sy 0 | 全留 | 0% | 0 |
混合方向只能一格一算
3 橫 + 3 豎 + 3 方進 grid-3x3(gap 8),逐格抓 drawImage 的源矩形,合計源像素 44,027,904、用掉 32,161,728、丟掉 11,866,176,整批 dropPct 26.9515。這一個數底下並存三種答案:橫 25%、豎 43.75%、方 0%。grid-2x2 的 gap 0 放橫/豎/方/動圖各一張,畫布只有 600×600,4 種裁法共存。換模板在拼圖頁裡只換格位與邊長,不換裁多少。
畫布尺寸由公式即時算出
網格類走 line 245-247 的 totalW=cols*300+(cols+1)*gap 與 cellW=cellH=300:gap 0 / 8 / 40 下 grid-2x2 是 600×600 / 624×624 / 720×720,grid-3x3 是 900×900 / 932×932 / 1060×1060;條帶類的格數等於張數,strip-h 放 300 張就是 92408×316。形狀類走 line 286-287 的 cellSize=floor(canvasW/density) 再減 gap,1200 配密度 2 得 600→592,格子數恆為 density*(density+1),即 6 / 12 / 30 / 110 / 420。
間距削背景,形狀削大半
先數與背景同色的像素:grid-2x2 gap 8 的 624×624 = 389,376 px 裡底色只有 29,376 px(7.5444%),墨佔 92.4556%;gap 40 的 518,400 px 裡底色 158,400 px。圓角也幾乎不佔量:3×3 半徑 30 一共只少畫 6,696 px、利用率 99.1733%。
形狀類才真的吃像素。預設參數(形狀大小 60、密度 2)的 1,440,000 px 成品裡,墨佔比圓形 22.543%、心形 48.9476%、菱形 12.6408%,其餘全是使用者選的底色。
放大端沒有畫質控制
模板全文沒有一處 imageSmoothingEnabled / imageSmoothingQuality 賦值(grep 0 命中),每次 drawImage 讀回 enabled=true、quality=low。1×1 的透明點在網格裡被拉成 300×300(shareOfSrc 90000)、在預設形狀裡拉成 592×592;反向看,4032×3024 落到 300×300 的單格裡只留下 0.74% 的像素(shareOfSrc 0.0074)。拉 300 倍與縮到 300 走的是同一條瀏覽器預設路徑,既沒有降質開關,也沒有畫質參數。
格子數寫死,張數不寫
2 / 9 / 16 / 30 / 60 張全部被接收,一次 input 選 300 張也一樣,程式碼裡沒有 files.length 判定分支;UU.toast 全文只有 line 140 / 376 / 384 三處,逐字是「请上传图片文件」「请先上传图片」「拼图已下载」。格子數卻寫死:grid-2x2 恆 4 格、grid-3x3 恆 9 格、形狀類預設密度 2 恆 6 格。5 張互不相同的圖進 grid-2x2,實際畫出的只有前 4 張,第 5 張(300×400)從未出現在 drawImage 記錄裡,訊息列卻仍寫「624 × 624 px | 5 張」。圖少於格子時按 line 328 的 (r*cols+c) % colImages.length 重複取用。兩種不匹配都不留空格、也不提示。
匯出只有一條 PNG 通道
toBlob 第 2 參恆為 image/png(line 385)、第 3 參未傳(reqQuality 實測 undefined),回呼 blob.type 也是 image/png。9 次 createImageBitmap 回讀的 decodedW/H 與當時 canvas.width/height 逐對相等;介面顯示的 680 只是 CSS(line 355-358 的 dispScale 封頂 1),不存在第二次縮放。成品尺寸等於畫布尺寸,網格類單格恆 300×300,4 張 4032×3024 拼出來只有 389,376 px——站點文案裡那句「匯出高畫質 PNG 拼圖」只能當成被核對的說法。
失敗線全是靜默
corrupt.png(72 B)與 corrupt_webp.webp(16 B)的 MIME 都合法、line 138 的 added 也已計數,但模板沒有 img.onerror,於是一張不進、0 條提示。硬線在瀏覽器:單維 65535 px。strip-h 放 218 張是 65400×300,還能匯出 7,849,564 B;219 張變成 65700×300,點陣圖根本沒分配、toBlob 回呼收到 null、line 379 的 createObjectURL 拋出 TypeError,line 384 那句提示也不會執行——使用者視角就是點了下載而什麼也沒有發生。
三個問到的點
Q:豎圖為什麼比橫圖裁得多?
方格邊長只能等於短邊。豎圖短邊是 1080,得從 1920 上下各去掉 sy 420,dropPct 43.75、丟 907,200 px;橫圖短邊是 3024,只需左右各去掉 sx 504,dropPct 25、丟 3,048,192 px。
Q:換一種模板能少裁一點嗎?
不能。7 個模板的 slotRatio 恆為 1,換模板只把邊長從 300 換成 592,橫圖仍丟 25%、豎圖仍丟 43.75%、方圖仍丟 0%。擺位與形狀怎麼選,是九宮格與心形拼圖線上做那篇的範圍,兩邊不重疊。
Q:一次放太多張會提示嗎?
不會。張數沒有判定分支,格子以外的圖直接被跳過;只有單維越過 65535 px 才真的失敗,而那次連「拼圖已下載」都不出現。