Kent Shen
← 所有文章

照片整理工具 Latent:全部在瀏覽器完成,連 HEIC 都不用上傳

  • Latent
  • 隱私
  • 前端

手機裡幾千張照片,旅行回來之後想整理,常常卡在「從哪裡開始」。Latent 想解決的就是這一步:把照片與影片拖進網頁,它依拍攝時間與地點自動分組,你再貼標籤、標示 NG,最後匯出成已經分好資料夾的 ZIP。

為什麼堅持不上傳

照片是最私人的資料之一,裡面有臉、有住家位置,還有 GPS 座標。如果整理照片要先上傳到某個伺服器,我自己都不放心。所以 Latent 是純前端:所有處理都在瀏覽器內完成,檔案不會離開你的電腦或手機,原始檔也永遠不會被修改。你做的調整(時間、座標、標籤、NG)只存在瀏覽器的 localStorage,並用「檔名加大小加修改時間」辨識照片,下次載入同一批照片時會自動套用。

網站不需要建置流程,沒有後端,只有一個資料夾的靜態檔案。函式庫(讀 EXIF 的 exifr、打包的 JSZip、HEIC 解碼器)都放在專案裡,不依賴第三方 CDN。

它怎麼分組

  • 依時間:可以切換成依天、依週或依月分組。
  • 依地點:同一組裡再依 500 公尺分區,地點名稱則是用內嵌的 GeoNames 離線資料,找最近的城市,所以不需要查詢任何線上地圖服務。
  • 沒有拍攝時間的照片:放到右側的「待分類」抽屜,拖到日期群組就會設成那一天。
  • 截圖:自動歸到「無時間排序」,因為截圖的時間通常沒有整理的意義。

自動偵測

它會辨識自拍(前鏡頭)、截圖(PNG 與檔名)、影片、全景(依長寬比)與可能模糊的照片(用邊緣清晰度判斷)。偵測是啟發式的,不是 100% 準確,所以我把結果當成篩選用的標籤,而不是自動刪除。

HEIC 與批次轉檔

iPhone 預設拍出 HEIC 格式,很多地方打不開。Latent 用 WebAssembly 在瀏覽器裡解碼,並且用多個 Worker 平行處理,可以先轉成 JPG,轉檔時還會把 EXIF 資料寫回去,不會丟失拍攝時間與地點。

記憶體是最大的限制

純前端的代價,是所有東西都在瀏覽器的記憶體裡。我實測並設了上限:電腦最多 2000 個檔案、3 GB;手機最多 800 個、2 GB,超過會請使用者分批。匯出時,如果 ZIP 超過一定大小(電腦 1 GB、手機 300 MB),就自動分成多包。

我也在 README 裡老實寫明:單包 1.5 GB 在我的開發機上實測成功,但匯入階段的 3 GB 與手機的上限只是估計,沒有在實機測過。開啟「HEIC 轉 JPG」匯出時,轉好的檔案會先全部放在記憶體裡,HEIC 很多時仍可能吃掉大量記憶體。哪些是實測過的、哪些只是估計,我覺得分清楚比假裝全都測過更重要。

可以離線使用

它也是一個 PWA。第一次載入之後,核心檔案都存在瀏覽器裡,沒有網路也能開、能分類、能匯出,甚至能轉 HEIC,還可以安裝成 App。每次更新核心檔案,我會把 service worker 的版本號加 1,舊的快取就會在新版啟用時清掉。

匯出的細節

匯出時可以選擇不分資料夾,或依標籤、日期、月份分類。依日期分資料夾時,可以勾選「加上地點」,每個資料夾取當天照片最常出現的城市,像是 2026-04-03 Kyoto。檔名以拍攝時間命名,所以依檔名排序就是時間順序。

另外有「整批平移時間」功能,處理出國時差或相機時鐘不準的情況,輸入 +8 小時或 -1 天,一次改完整批,而且可以復原。

你可以到 Latent 按「用範例照片試試看」,範例是京都與富士山的照片,時間與地點是示範用的資料。