画像編集アプリ Photopea が、File Handling API を使用して、ユーザーがファイル エクスプローラーからファイルを開く仕組み

File Handling API を使用すると、ウェブアプリは、アプリケーションがサポートできるファイル形式のファイル ハンドラとして自身を登録できます。画像編集アプリケーション Photopea がこの API を使用する方法を学びます。

はじめに

(この記事は動画でもご覧いただけます)。

Photopea は、Ivan Kutskir が開発した無料のオンライン画像エディタです。Ivan は 2012 年にアプリの開発を開始し、Photopea に追加した主な機能を共有するブログを運営しています。Photopea では、PSD(Adobe Photoshop)、XCF(GIMP)、Sketch(Sketch App)、XD(Adobe XD)、CDR(CorelDRAW)の各形式に対応しています。

Photopea アプリ

Photopea でのファイル処理

Photopea はインストール可能な PWA として、ユーザーがアプリのインストールを選択するとスタンドアロン ウィンドウで実行されます。これにより PWA の超能力が発揮され、Photopea ではファイル処理を多用します。

File Handling API の宣言型部分

インストール後、Photopea は、自身がサポートする各種ファイル形式のオペレーティング・システムに、自身をファイル・ハンドラとして登録します。これは、ウェブアプリ マニフェストfile_handlers フィールドを追加することで行います。サポートされている各ファイルタイプはオブジェクトであり、action の値は相対 URL、accept オブジェクトは MIME タイプと関連するファイル拡張子のマップです。例: {"image/jpeg": [".jpeg", ".jpg"]}。次のコードは、Photopea の本番環境ウェブアプリ マニフェストです。関連部分がハイライト表示されています。

{
    "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 で、ユーザーがファイルを右クリックして [Photopea で開く] を選択している様子。

File Handling API の命令型部分

API の命令的な部分では、オペレーティング システムが PWA に渡すファイルを実際に処理します。Photopea のコードは明らかに極端に圧縮され、醜くされていますが、それでも以下のスニペットの要点は理解しやすいものです。LaunchQueue インターフェース(N として最小化)には、関数を引数として受け取る setConsumer() メソッドがあります。この関数は、LaunchParams オブジェクト(W として最小化)を受け取ります。この LaunchParams オブジェクトには、FileSystemHandle オブジェクトの読み取り専用配列を指す files プロパティがあり、コードの残りの部分はループし、それぞれが 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 を発見しました。ファイル処理は最終的に Chrome 102 でリリースされ、Photopea のユーザーが日常的に使用する人気機能になりました。ゲームチェンジャーと呼ぶユーザーもいます。ぜひ Photopea をお試しください。デスクトップにインストールして、サポートされているファイル形式を開いてみてください。画像編集を楽しんでください。