圖片編輯應用程式 Photopea 如何使用 File Handling API 讓使用者透過檔案探索工具開啟檔案

「File Handling API」可讓網頁應用程式自行註冊為檔案處理常式,以便提供應用程式支援的檔案格式。瞭解相片編輯應用程式 Photopea 如何運用這個 API。

伊凡.庫茲斯基爾 (Ivan Kutskir)
Ivan Kutskir

簡介

(這篇文章也可以影片的形式提供)。

PhotopeaIvan Kutskir 開發的免費線上圖片編輯器。Ivan 從 2012 年開始製作這款應用程式,負責維護一個網誌,分享他加入 Photopea 的主要功能。Photopea 支援 PSD (Adobe Photoshop)、XCF (GIMP)、Sketch (Sketch App)、XD (Adobe XD) 和 CDR (CorelDRAW) 格式。

Photopea 應用程式。

Photopea 中的檔案處理功能

Photopea 是可安裝的 PWA,當使用者選擇安裝應用程式時,Photopea 會在獨立視窗中執行,這個模式可解鎖 PWA 的強大效能,而 Photopea 會大量使用檔案處理功能。

File Handling API 宣告式部分

安裝完成後,Photopea 會根據支援的各種檔案格式,向作業系統註冊為檔案處理常式。在網頁應用程式資訊清單中加上 file_handlers 欄位,即可完成這項操作。每個支援的檔案類型都是一個物件,action 的值都有相對網址,而 accept 物件是 MIME 類型的對應以及相關聯的副檔名。例如:{"image/jpeg": [".jpeg", ".jpg"]}。下列程式碼是 Photopea 生產環境的 Web App Manifest,並醒目顯示相關部分。

{
    "name": "Photopea",
    "short_name": "Photopea",
    "display": "standalone",
    "icons": [
        {  "src": "promo/icon512.png",     "type": "image/png", "sizes": "512x512"  },
        {  "src": "promo/maskable512.png", "type": "image/png", "sizes": "512x512", "purpose":"maskable"  }
    ],
    "start_url": "/?utm_source=homescreen",
    "background_color":"#0f171d",
    "theme_color": "#474747",
    "file_handlers": [
        { "action": "/", "accept": {  "image/psd" : [ ".psd" ]  } },
        { "action": "/", "accept": {  "image/jpeg": [ ".jpeg", ".jpg" ]  } },
        { "action": "/", "accept": {  "image/png" : [ ".png" ]  } },
        { "action": "/", "accept": {  "image/webp": [ ".webp" ]  } },
        { "action": "/", "accept": {  "image/bmp" : [ ".bmp" ]  } },
        { "action": "/", "accept": {  "image/gif" : [ ".gif" ]  } },
        { "action": "/", "accept": {  "image/svg+xml": [ ".svg" ]  } },
        { "action": "/", "accept": {  "image/pdf" : [ ".pdf" ]  } },
        { "action": "/", "accept": {  "image/tiff": [ ".tif", ".tiff" ]  } },
        { "action": "/", "accept": {  "image/ai"  : [ ".ai"  ]  } },
        { "action": "/", "accept": {  "image/psb": [ ".psb" ]  } },
        { "action": "/", "accept": {  "image/xcf": [ ".xcf" ]  } },
        { "action": "/", "accept": {  "image/sketch": [ ".sketch" ]  } },
        { "action": "/", "accept": {  "image/xd" : [ ".xd"  ]  } },
        { "action": "/", "accept": {  "image/pxd": [ ".pxd" ]  } },
        { "action": "/", "accept": {  "image/cdr": [ ".cdr" ]  } },
        { "action": "/", "accept": {  "image/eps": [ ".eps", ".ps" ]  } },
        { "action": "/", "accept": {  "image/x-icon": [ ".ico" ]  } },
        { "action": "/", "accept": {  "image/jpx": [ ".jpx" ]  } },
        { "action": "/", "accept": {  "image/jp2": [ ".jp2" ]  } },
        { "action": "/", "accept": {  "image/x-tga": [ ".tga" ]  } },
        { "action": "/", "accept": {  "image/vnd-ms.dds": [ ".dds" ]  } }
    ],
    "share_target": {
        "action": "/",
        "method": "POST",
        "enctype": "multipart/form-data",
        "params": {
            "files": [
            {
                "name": "image",
                "accept": ["image/jpeg", "image/png", "image/webp", "image/gif"]
            }
          ]
        }
    }
}

在 macOS Finder 中,使用者是在檔案上按一下滑鼠右鍵,然後選擇「選擇開啟工具」。

File Handling API 不可或缺的部分

接著,這個 API 的必要部分,接著會處理作業系統傳遞至 PWA 的實際檔案。Photopea 的程式碼明顯縮到最小及修正,但下列程式碼片段其實沒有太多限制。LaunchQueue 介面 (最小化為 N) 的 setConsumer() 方法,可接受函式做為引數。這個函式接著會接受 LaunchParams 物件 (最小化為 W)。此 LaunchParams 物件具有指向 FileSystemHandle 物件的唯讀陣列,其中其餘程式碼會在呼叫 getFile() 並循環播放,並針對每個物件循環取得 File 物件 (最小化為 G)。files接著,這個檔案會傳遞至 Photopea 中負責顯示檔案的其他邏輯。

var N = window.launchQueue;
if (N) {
  var $ = this.UA;
  N.setConsumer(function (W) {
    var O = W.files;
    console.log(O);
    for (var Y = 0; Y < O.length; Y++) {
      var T = O[Y];
      T.getFile().then(function (G) {
        $.YO([G], null, null, null, [T]);
      });
    }
  });
}

結論

使用者持續要求 Photopea 成為圖片的檔案處理常式。2020 年,問題出現時,這項功能令人難以想像中。不過,在 2022 年初,使用者發現檔案處理 API 仍在 2022 年初時,卻仍在標記中。檔案處理功能最終是在 Chrome 第 102 版推出,也是廣受使用者喜愛的 Photopea 功能,有些甚至稱之為扭轉器。請務必試用 Photopea,然後在電腦上安裝,然後嘗試開啟其中一種支援的檔案格式!祝你編輯愉快!