Resim düzenleme uygulaması Photopea, kullanıcıların dosyaları dosya gezgininden açmasına olanak tanımak için File processing API'yi nasıl kullanır?

File Handling API, web uygulamalarının kendilerini destekleyebilecekleri dosya biçimleri için dosya işleyici olarak kaydetmelerine olanak tanır. Photopea resim düzenleme uygulamasının bu API'yi nasıl kullandığını öğrenin.

Giriş

(Bu makaleyi video olarak da inceleyebilirsiniz.)

Photopea, Ivan Kutskir tarafından geliştirilen ücretsiz bir online resim düzenleyicidir. Ivan, uygulama üzerinde 2012'de çalışmaya başladı ve Photopea'ya eklediği önemli özellikleri paylaştığı bir blog'u yönetiyor. Photopea; PSD (Adobe Photoshop), XCF (GIMP), Sketch (Sketch Uygulaması), XD (Adobe XD) ve CDR (CorelDRAW) biçimleriyle çalışabilir.

Photopea uygulaması.

Photopea'da dosya işleme

Yüklenebilir bir PWA olarak Photopea, kullanıcı uygulamayı yüklemeyi seçtiğinde bağımsız bir pencerede çalışır. Bu sayede Photopea'nın yoğun olarak kullandığı bir PWA süper gücünün kilidi açılır: dosya işleme.

File Handling API'nin açıklayıcı kısmı

Photopea, yüklendikten sonra desteklediği farklı dosya biçimleri için işletim sistemine dosya işleyici olarak kaydedilir. Bu işlem, Web Uygulama Manifesti'ne file_handlers alanı eklenerek yapılır. Desteklenen her dosya türü bir nesnedir. action değeri göreli bir URL'ye, accept nesnesi ise MIME türlerinin ve ilişkili dosya uzantılarının haritasına sahiptir. Örneğin, {"image/jpeg": [".jpeg", ".jpg"]}. Aşağıdaki kod, ilgili bölümlerin vurgulandığı Photopea'nın üretim Web Uygulaması Manifest'idir.

{
    "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, kullanıcının dosyayı sağ tıklayıp Photopea'yla "Birlikte aç"ı seçiyor.

File Handling API'nin zorunlu kısmı

Daha sonra API'nin zorunlu kısmı, işletim sisteminin PWA'ya aktardığı dosyaların gerçekten işlenmesiyle ilgilenir. Photopea'nın kodu açıkça çok fazla küçültülmüş ve çirkinleştirilmiş olsa da aşağıdaki snippet'in ana fikrini kavramak o kadar da zor değil. LaunchQueue arayüzünde (N olarak küçültülmüştür), bağımsız değişken olarak işlev kabul eden bir setConsumer() yöntemi vardır. Bu işlev de bir LaunchParams nesnesi (W olarak küçültülmüş) alır. Bu LaunchParams nesnesinin, salt okunur bir FileSystemHandle nesnesi dizisini işaret eden bir files mülkü vardır. Kodun geri kalanı bu diziyi döngüden geçirir ve her birinde getFile() çağrısı yaparak File nesnesini (G olarak küçültülür) alır. Bu dosya daha sonra Photopea'da dosyayı görüntüleyen diğer mantığa iletilir.

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]);
      });
    }
  });
}

Sonuçlar

Photopea'nın resim dosyası işleyicisi olmasını kullanıcılardan uzun süredir istiyorduk. Soru 2020'de ortaya çıktığında bu özellik tamamen düşünülemezdi ancak hevesli bir kullanıcı, dosya işleme API'sini 2022'nin başlarında henüz işaretliyken ilk aşamalarında keşfetti. Dosya işleme özelliği Chrome 102'de kullanıma sunuldu ve kullanıcılar tarafından günlük olarak kullanılan sevilen bir Photopea özelliği haline geldi. Hatta bazı kullanıcılar oyunu değiştiren bir özellik olarak nitelendiriyor. Photopea'yı deneyin, masaüstünüze yükleyin ve desteklediği dosya biçimlerinden birini açmayı deneyin! İyi eğlenceler dileriz.