運作方式

你的檔案由你正在用的瀏覽器打開,從來不會被送去任何地方。

以下是實際跑的東西,按執行順序排列,還有一分鐘之內自己驗證的方法。

檔案是被讀取,不是被上傳

放入檔案時,頁面拿到的是一個 File 物件,用 File API 在這個分頁裡讀進記憶體。沒有任何請求帶著它走,因為根本沒有地方可以去:這個網站只是 CDN 上的靜態檔案,沒有伺服器程式可以接收東西。

  • File 與 Blob 承載位元組,FileReader 與 arrayBuffer 負責讀取
  • 拖放、選檔、貼上,交出來的都是同一個物件
  • 只要有頁面出現 fetch、上傳、form action 或 API 路徑,建置就會失敗

解碼在分頁裡發生

相機和設計軟體寫出的格式,瀏覽器自己打不開,所以解碼器隨頁面一起送到,就在旁邊執行。

  • HEIC 與 HEIF:libheif 的 JavaScript 版本,由本站自己提供
  • PDF:PDF.js,其中部分影像編解碼會用到 WebAssembly
  • SVG 描摹用 ImageTracer;讀 QR 用 jsQR;寫 PDF 用 pdf-lib
  • 每一個函式庫都在建置時下載並由本網域提供,所以沒有第三方 CDN 看得見你的造訪

處理跑在 canvas,而且在 worker 裡

縮放、壓縮、轉檔都是 canvas 運算。它們在 Web Worker 內執行,所以大張相片不會讓你眼前的頁面卡住。

  • worker 裡的 OffscreenCanvas 負責繪製與重新編碼每一張圖
  • convertToBlob 產生 JPG、PNG 或 WebP,品質由你決定
  • PNG 壓縮用的是為本站自己寫的 median cut 調色盤,不是外來函式庫
  • 檔案的任何資訊 —— 名稱、大小、內容或由它們推導出來的東西 —— 一律不量度、不回報

結果也是在這裡造出來的

你下載的東西,是在這個分頁組好的 Blob,再以 object URL 交給瀏覽器。它從來沒有在別的地方存在過。

  • 一次一個檔案,或在分頁裡打包成 ZIP
  • 關掉分頁結果就消失;沒有任何東西被存起來等你回來拿

自己驗證

不要只信這一頁。兩個方法,都不用一分鐘。

  • 開 DevTools 的 Network 分頁,然後轉一個檔案。不會有任何帶著你檔案的請求離開。
  • 載入頁面後把網路關掉,再用那個工具。它照樣運作。
  • 看原始碼:這裡跑的每一樣東西都是你可以直接打開來看的檔案。

裝置端與上傳式工具並排比較

兩種工具都存在,也都正當。分別在於你的檔案去了哪裡,而這個分別決定了你要相信什麼。

在你的裝置上上傳到伺服器
檔案去哪裡留在分頁內傳去伺服器
保留多久沒有東西需要保留通常在設定的時限後刪除
可否離線用頁面載入後可以不可以
檔案大小上限你裝置的記憶體服務容許的上限
你要相信什麼頁面做了什麼,而你看得到服務聲稱自己做了什麼

每一個工具,同一套規矩

全部都是這樣運作。這裡沒有付費版、沒有帳戶,也沒有會離開的檔案。

圖片PDF轉換文字QR計算機時間日期色彩開發財務健康全部工具