图片编辑应用 Photopea 如何使用 File Handling API 允许用户从文件资源管理器打开文件

借助 File Handling API,Web 应用可以将自己注册为应用可以支持的文件格式的文件处理程序。了解图片编辑应用 Photopea 如何使用此 API。

简介

(本文也可以视频形式提供)。

Photopea 是由 Ivan Kutskir 开发的一款免费在线图片编辑器。Ivan 于 2012 年开始开发这款应用,并维护了一个博客,分享他为 Photopea 添加的主要功能。Photopea 支持 PSD (Adobe Photoshop)、XCF (GIMP)、Sketch (Sketch App)、XD (Adobe XD) 和 CDR (CorelDRAW) 格式。

Photopea 应用。

Photopea 中的文件处理

作为可安装的 PWA,当用户选择安装该应用时,Photopea 会在独立窗口中运行。这样一来,Photopea 就可以充分利用 PWA 的强大功能:文件处理

File Handling API 的声明部分

安装后,Photopea 会将自己注册为操作系统的文件处理程序,以处理它支持的不同文件格式。在Web 应用清单中,可以通过添加 file_handlers 字段来实现此目的。每个受支持的文件类型都是一个对象,action 的值为相对网址,accept 对象是 MIME 类型与关联文件扩展名的映射。例如 {"image/jpeg": [".jpeg", ".jpg"]}。以下代码是正式版 Photopea 的 Web 应用清单,其中突出显示了相关部分。

{
    "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"]
            }
          ]
        }
    }
}

用户右键点击某个文件,然后选择“打开方式”Photopea,即可打开 macOS 查找工具。

File Handling API 的命令式部分

然后,API 的命令部分负责实际处理操作系统传递给 PWA 的文件。Photopea 的代码显然经过了大量的缩减和美化,但下面代码段的要点并不难掌握。LaunchQueue 接口(缩减为 N)具有 setConsumer() 方法,该方法接受函数作为参数。此函数又接受 LaunchParams 对象(缩减为 W)。此 LaunchParams 对象有一个 files 属性,指向一个只读 FileSystemHandle 对象数组,然后代码的其余部分会循环遍历该数组,并通过调用 getFile() 为每个对象获取 File 对象(缩减为 G)。然后,此文件会传递给 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 的早期版本,当时该 API 还处于标志后台阶段。文件处理功能最终在 Chrome 102 中推出,已成为用户日常常用的 Photopea 功能之一,用户甚至称其为游戏变革者。请务必试用一下 Photopea,将其安装在您的桌面设备上,然后尝试打开它支持的某种文件格式!祝您编辑愉快!