shadcn.io— 何千もの shadcn/ui ブロック
コンテンツへ移動

ブラウザ内での画像変換は実際どう動くのか(そして、なぜそう作ったのか)

このサイト全体が存在する理由は、何年も前に感じた小さくて間の抜けた不安の一瞬にあります。HEICの写真を一枚JPGに変換したくて、検索バーに当たり前のことを打ち込み、たどり着いたのは、自分の写真をサーバーにアップロードしろと求めてくる変換サイトでした。だから、そうしました。動きました。そのあとそこに座って考えたのです —— あの写真は今、自分が何も知らないどこかのマシンの上に、一度も会うことのない人たちに運用され、教えられたこともない期間だけ、置かれている。ただのスクリーンショットなら構いません。でも、それはスクリーンショットではありませんでした。個人的な写真で、それを30秒節約するために見知らぬ相手へ手渡してしまったのです。

それが、もう二度と抱えたくないと決めた問題でした。答えは、そもそもアップロード自体が最初から必要なかった、というものでした。

古いやり方: 見知らぬ人のコンピューターを借りる

昔ながらのオンライン変換ツールは、代行サービスのように動きます。ファイルをサーバーへ送り上げる。サーバーは、そのマシンに入ったソフトウェアで変換を実行する。結果を送り返してくる。あなたの画像は、管理できないハードウェアを一往復し、その途中のどこかで、あなたのものではないディスクの上に、丸ごと居座っていたわけです。

そのモデルに後付けされたプライバシーの約束は、すべて振る舞いについての約束です —— ファイルは1時間後に削除される、誰も見ない。たぶん守られる。守られるのかもしれません。でも確かめる手段はなく、ファイルの実際のバイトをその約束に預けることになります。信頼が設計のすべてで、その信頼こそ、私が費やしたくなかったものでした。

新しいやり方: ブラウザはもうコンピューターを持っている

変わったのはここです。今のブラウザは、WebAssembly —— 略してWASM —— という仕組みを通じて、本物のコンパイル済みプログラムをネイティブに近い速度で動かせます。かつてサーバーに置かれていた画像コーデック —— PNGを読み、WebPをエンコードし、HEICをデコードするコード —— は、WASMにコンパイルして、すでに開いているブラウザのタブの中で動かせます。

だから、こうして作られたページにファイルを置くと、変換ソフトウェアはウェブページの他の部分と同じように、一度だけ自分のマシンにダウンロードされます。そこから先の実際の作業 —— 画像を読み、変換し、新しいファイルを書き出す —— は、自分のプロセッサ、自分のメモリの上で起きます。結果はそのままダウンロードとして返ってきます。ファイルはどこにも送られません。送る先が存在しないからです。経路にサーバーが一つもないのです。

だから「ファイルは端末から出ません」を、方針としてではなく事実として言えます。見ないと約束しているのではありません。あなたの画像が私のところへ届く経路そのものが存在しないのです。裁判所に命じられても、あなたの写真を取り出すことはできません。そもそも回線のこちら側に一度も来ていないからです。プライバシーは上から足した機能ではありません。コードがどこで動くかから導かれる帰結です。

それが本当だと確かめる方法

私の言葉を信じる必要はありません。そこが一番気に入っている点です。ブラウザの開発者ツールを開き、ネットワークタブを見ながらファイルを変換してみてください。ページとWASMコーデックが一度ダウンロードされるのは見えます。あなたの画像が送り上げられる様子は見えません。さらにいい方法があります —— ページを読み込んで、Wi-Fiを切って、それでも何か変換してみてください。それでも動きます。必要なものはすべて、すでに自分のマシンにあるからです。ファイルをアップロードするツールには、これができません。こちらにはできます。

唯一の本当の限界

正直に書くと約束したので、書きます。自分の端末で変換を動かすということは、自分のメモリを使うということで、ブラウザのタブに無限のメモリが与えられるわけではありません。

普通のファイル —— 写真、スクリーンショット、ロゴ、人が一日中変換しているもの —— なら、これは問題になりません。でも、本当に途方もないものを投げれば、極端な解像度の一枚や、巨大な量を一度にまとめて、といった場合は上限にぶつかることがあります。画像をデコードするというのは、その非圧縮の画素をメモリに保持するということで、ディスク上のファイルよりはるかに大きく、巨大な画像はタブに許された容量を使い切ることがあります。そうなると変換は這うほど遅くなるか、タブが諦めます。

64GBのRAMを積んだサーバーには、その問題はありません。だから取引をはっきり書きます —— サーバー側の変換ツールは、自分の端末では到底扱えないほど大きなファイルも噛み砕けます。この方式にはできません。その代わりに得られるのは、ファイルが自分の手から一切離れないことです。人が実際に変換するものの圧倒的多数にとって、これは迷わず選ぶ価値のある取引です。ごくまれな怪物のようなファイルにとっては、本当の限界です。それを無かったことにするより、伝えるほうを選びます。

それでもこれが正しいデフォルトだと考える理由

ほとんどの変換は、そもそもサーバーに触れる必要のなかった、ごく普通のファイルです。アップロードは、ブラウザが自分でこの作業をこなせなかった時代の名残でした。今はこなせます。だから、まともなデフォルトは反転しました —— ファイルは自分のマシンに置き、作業はローカルで行い、サーバーに手を伸ばすのは自分のハードウェアが本当に対処しきれないまれな場合だけにする。

それがここにあるすべての背後にある考えです。あの不安な午後のあと、自分のために作ったのと同じサイトで、ファイルの拡張子を変えるためだけに個人的な写真を見知らぬ相手へ手渡すことを、もう二度としなくて済むように作りました。結局、その必要はなかった。あなたにも、その必要はありません。

関連記事


記事一覧