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 işleme API'sı, web uygulamalarının, destekleyebileceği dosya biçimleri için kendilerini dosya işleyici olarak kaydetmelerine olanak sağlar. Resim düzenleme uygulamasının Photopea'nın bu API'den nasıl yararlandığını öğrenin.

İvan Kutskir
Ivan Kutskir

Giriş

(Bu makale video biçiminde de mevcuttur.)

Photopea, Ivan Kutskir tarafından geliştirilen ücretsiz bir çevrimiçi resim düzenleyicidir. Uygulama üzerinde çalışmaya 2012'de başlayan Ivan, Photopea'ya eklediği temel özellikleri paylaştığı bir blog düzenliyor. Photopea PSD (Adobe Photoshop), XCF (GIMP), Sketch (Sketch App), 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. Böylece, Photopea bir PWA süper gücünü ortaya çıkarır ve Photopea bu dosya işlemeyi yoğun bir şekilde kullanır.

File Process API'nin bildirim temelli bölümü

Yükleme sonrasında Photopea, desteklediği farklı dosya biçimleri için işletim sisteminde kendisini bir dosya işleyici olarak kaydeder. Bu işlem, Web Uygulaması Manifest'inde file_handlers alanı eklenerek yapılır. Desteklenen her dosya türü bir nesnedir. action öğesinin değeri olarak göreli bir URL, accept nesnesi ise MIME türlerinin ve ilişkili dosya uzantılarının eşleştirmesini içerir. Örneğin, {"image/jpeg": [".jpeg", ".jpg"]}. Aşağıdaki kod, ilgili bölümler vurgulanmış şekilde, Photopea'nın Web Uygulaması Manifest'inin üretim sürümüdür.

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

Kullanıcının bir dosyayı sağ tıklayıp "Birlikte aç" Photopea'yı seçtiği macOS Finder.

File Process API'nin zorunlu kısmı

Ardından, API'nin zorunlu kısmı işletim sisteminin PWA'ya ilettiği dosyaların fiilen işlenmesiyle ilgilenir. Photopea'nın kodu büyük ölçüde küçültülmüş ve sadeleştirilmiştir. Yine de aşağıdaki snippet'in ana fikrini anlamak o kadar zor değildir. LaunchQueue arayüzünde (N olarak kısaltılmış), işlevi bağımsız değişken olarak kabul eden bir setConsumer() yöntemi bulunur. Buna karşılık, bu işlev bir LaunchParams nesnesi (W olarak küçültülmüş) alır. Bu LaunchParams nesnesi, FileSystemHandle nesnelerinden oluşan salt okunur bir diziyi işaret eden bir files özelliğine sahiptir. Kodun geri kalanı daha sonra döngü oluşturur ve her bir öğe için getFile() çağrısı yaparak File nesnesini (G olarak küçültülür) elde eder. Daha sonra bu dosya, Photopea'da dosyanın görüntülenmesiyle ilgili başka bir mantığa aktarılır.

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

Kullanıcılar uzun süredir Fotopea'nın resimler için dosya işleyici olmasını istiyorlar. 2020'de bu soru ortaya çıktığında bu özellik tamamen düşünülemezdi. Ancak dosya işleme API'sini hevesli bir kullanıcı, 2022'nin başlarında hâlâ bir bayrak arkasındayken ilk aşamalarında keşfetti. Dosya işleme özelliği nihayet Chrome 102'de kullanıma sunuldu ve kullanıcıları tarafından günlük olarak kullanılan popüler bir Photopea özelliği. Hatta bazıları, bu özelliğin çığır açıcı olduğunu söylüyor. Photopea'yı mutlaka deneyin, masaüstünüze yükleyin ve ardından desteklediği dosya biçimlerinden birini açmayı deneyin! İyi resim düzenleme işlemleri!