雜記 › 生活隨筆 › 橫圖裁掉 25%、豎圖裁掉 43.75%:7 個拼圖模板逐格算一筆幾何帳

橫圖裁掉 25%、豎圖裁掉 43.75%:7 個拼圖模板逐格算一筆幾何帳

這筆帳的入口:格子全是正方形

同一批照片進方格,橫著拍的被裁掉 25%,豎著拍的被裁掉 43.75%,正方形構圖一點沒動。差異不在模板——7 個模板(templates 陣列 line 86-94)的格子全是正方形,slotRatio 恆為 1:形狀類 line 305 的 pw/ph 相等,網格類 line 340 的 300/300。被裁的百分比只與源圖長寬比有關,模板之間只差目標邊長,網格類恆 300、預設形狀類 592。

橫、豎、方各丟多少

裁切分支在 line 343-347:橫圖沿寬左右各裁,豎圖沿高上下各裁,方圖不需要偏移。

源圖保留邊偏移量保留丟掉丟掉的像素
4032×30243024×3024sx 50475%25%3,048,192
1080×19201080×1080sy 42056.25%43.75%907,200
640×640640×640sx/sy 0全留0%0
圖 1 丟棄比例只取決於長寬比 4032×3024 丟 25% 1080×1920 丟 43.75% 640×640 丟 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 才真的失敗,而那次連「拼圖已下載」都不出現。

📎 相關文章

淺底白字浮水印設到 5% 等於沒加:匯出 4782 位元組與底圖一位元組不差 2026-10-28 28 天還是 29 天:1 月 31 日加一個月要自己換算 2026-10-28 字帖每頁放幾個字:預設 A4 是 20 個,不是 100÷4=25 2026-10-27 同一天既是週末又被登記成補班,工作日計算器聽誰的 2026-10-27 倒數計時裡的 86400 秒一天,碰上夏令時間會少給你 1 天 2026-10-27