SVGフィルタによる画像の隠蔽(提案・検証)

written by DEFGHI1977.

これは何?

オリジナルの画像データをWEB環境で公開する際, 問題となる点が画像の無断複製です. 特に商用目的の金銭的な対価を伴うものであれば, 意図しない画像の拡散は出来る限り避けたいところです. 一方インターネットの仕組み上, WEBサーバーで公開した画像データはWEBブラウザに表示されるまでに様々な場所に複製されます. つまり, データが拡散する前提の環境でデータの無断複製を抑制する必要があるのです. 一見矛盾した内容であるものの潜在的なニーズは大きく, これまでもflashを使ったもの等の幾つかの解決策が存在しています.

本ページはこの問題を新たにSVGフィルタを用いて解決することを目標とします.

元画像の選択
画像の復元

試し方

  1. 「元画像の選択」から画像を選択します.
  2. 「保存」ボタンをクリックし, 隠蔽済画像をダウンロードします.
  3. 「画像の復元」から上でダウンロードした画像を読み込みます.
  4. 元画像が表示されることを確認します.
  5. スタイル設定を変更したり画像を別ウインドウに表示したりして画像が隠蔽されていることを確認します.

Firefox及びChromeでのみ動作を確認しています. Firefoxで作成した画像をChromeで読み込む, もしくはその逆も可能です.
※Edgeについてはimg/canvas要素におけるSVGフィルタの参照をサポートしないため正しく動作しません. なおSVGのimage要素であればうまく行くかもしれません(未検証).
※Safariについては未確認です.

基本原理

元となる画像に事前に用意しておいたノイズ画像を加算・除去するフィルタを用意し, WEBブラウザ表示時にそれぞれのフィルタ効果が打ち消し合うことで元画像が復元されるようにします. 式で表すなら元画像を\(G\), ノイズを加算するフィルタを\(e\), ノイズを除去するフィルタを\(d\)とすると, \(G = d(e(G))\)のように記述できます.

ここでWEBサーバーには\(e(G)\)なる画像を配置しておき, WEBブラウザで表示する際に(CSSによって)フィルタ\(d\)が適用されるようにすると, ブラウザスクリーン上でのみ元画像が表示, つまり「\(G = d(e(G))\)」の関係が成立します. 一方意図しないルートで画像が流出したとしても, 拡散した画像\(e(G)\)にはノイズが載っているため元画像が判りません.

フィルタ構成の実際

先ほどの原理は理想のもので, 実際には仕様上\(G = d(e(G))\)のような元画像を完全に復元するようなフィルタの対を構成することは出来ず, \(d(e(G))\)で得られる画像は\(G\)を減色した\(G'\)となります.

以下は本ページで利用しているフィルタです. feTurbulence要素が画像を隠蔽するためのノイズ画像を生成している原始フィルタで, 後続のfeCompositeがノイズ画像の加算・除去を行う本体です.

各構成要素の関連を図にすると次のようになります.

フィルタ概念図

なおノイズの比率を上げた場合復元画像の品質が落ちる一方で, 目視による判読のリスクが軽減されます.

特徴

注意点・課題等

左は0.5pxずれたことで復元フィルタの適用に失敗する例(Chromeで確認可)

応用等