あなたのカットインの縁が黒ずむ理由は、1987年に決まっていた

透過したはずのカットインを読み込んだら、キャラクターの輪郭に薄汚れた黒い縁が残っている。光のエフェクトのふちがギザギザに割れている。

書き出し設定をいじっても直りません。これはあなたのミスではなく、GIFという規格の仕様です。

というところまでは知っていたんですが、「じゃあ代わりに使うAPNGって何なんだ」が気になって調べてみたら、思っていたより面白い経緯がありました。この規格は、2007年に公式に却下されています。却下されたまま、今あらゆるブラウザで動いているようです。

先に実用の話をして、後半でその経緯を書きます。


GIFの透明度は「0か1」しかない

GIFが決めた透明度の扱いは、シンプルです。そのピクセルは、透明か、不透明か。

中間がありません。1ビット、つまり2択です。

1987年当時、これは合理的な設計だったはずです。回線は遅く、色数は256色で十分で、透明度に8ビットも割く余裕はない。用途はウェブページのアイコン程度でした。

問題は、いま私たちが作りたいものが「アイコン」ではないことです。

  • 光のグロー。中心から外に向かって徐々に薄くなる

  • 煙、霧、飛沫。全体が半透明

  • ぼかしの効いた縁。輪郭が滑らかに消えていく

  • フェードインとフェードアウト。時間方向に透明度が変化する

これらは全部、中間の透明度で成立している表現です。GIFに入れると、中間だった部分が「透明」か「不透明」に強制的に振り分けられます。

50パーセント透明だったピクセルが不透明側に倒れると、そこには元の背景色が焼き付いたまま残ります。白背景で作れば白い縁、黒背景で作れば黒い縁。あの汚れの正体はこれです。

そして振り分けの境界がピクセル単位で発生するので、なめらかだった輪郭が階段状になります。ジャギの正体もこれ。

ここは設定では直りません。フォーマットを変えるしかない、というのが結論です。


ここから調べた話

PNGは「特許を回避するため」に生まれたらしい

そもそもなぜPNGという規格があるのか。知らなかったので調べました。

GIFの圧縮方式であるLZWには特許がついていて、権利を持っていたUnisysが1990年代に権利行使の姿勢を示したことで、GIFを使うことに法的な不安が生じたそうです。この特許は米国では2003年に失効していますが、それまでの不確実性が、ロイヤリティフリーの代替フォーマットを求める動きにつながった、と。

そうして作られたのがPNGです。GIFの置き換えとして設計されたので、当然、弱点も潰してあります。256色制限と1ビット透過の廃止。フルカラーで、透明度を256段階持てる。

ただしPNGは1枚絵の規格として設計されたので、動きません。

却下された規格、APNG

「PNGの画質でGIFのように動くもの」が必要でした。

Wikipediaによると、2004年にMozillaのStuart ParmenterとVladimir Vukićevićという2人がその仕様を作ったのがAPNGの始まりだそうです。

同じ目的の規格としてMNGというものが既にあったのですが、Mozillaは2003年5月にMNGのサポートを打ち切っています。デコーダのライブラリが300KBと大きすぎたから、とのこと。300KBが「大きすぎる」という感覚が時代を感じます。PNGのデコーダを流用したAPNGは、はるかに軽量だったそうです。

ところが、PNG開発グループはこれを歓迎しなかった。PNGは単一画像フォーマットとして構想されたものだ、というのが原則論だったようです。

面白いのがここからで、妥協案も出ていたらしいんですね。専用のMIMEタイプを使えば折り合えるのではないか、と。ところがAPNG側は新しいMIMEタイプ(image/apng)は採用しつつ、拡張子は `.png` のまま押し通した。ここで決裂したと書かれています。

そして2007年4月20日、PNG開発グループはAPNGを公式な拡張として正式に却下しました。

普通ならここで消えるはずです。

生き延びた理由に日本が出てくる

却下されたあとも、APNGは「野良規格(rogue standard)」として使われ続けたそうです。

これを取り上げた2013年のTechCrunchの記事を読んでいたら、こう書かれていました。日本では、Pixivで作品を公開する多くのアーティストがこの形式を使い続けていた、と。

標準化の政治とは無関係に、「透過アニメーションをきれいに出したい」という需要が現場にあり続けたわけです。ここは正直、ちょっと嬉しくなりました。

そして時間が経つと、実装のほうが追いつきます。2015年にWebKitがサポートを取り込み、2017年3月にはChromiumにも実装が入っています。

現在、Chrome / Edge / Firefox / Safari のすべてがAPNGを表示できます。正式な規格として承認されないまま事実上の標準になった、ということのようです。


実務上の結論

透過アニメーションを作るなら、APNG。半透明を含む表現をGIFに入れる限り、縁の汚れは消えません。

もうひとつ、調べていて感心した点を。
APNGは「最初のコマが通常のPNGとして読める」構造になっているそうです。追加のコマは、PNGの仕様が元々許容している拡張チャンクに格納されているため、と。

つまり、APNGに対応していない環境で開いても、静止画として1コマ目が表示される。壊れて何も出ない、という事故が起きにくい設計になっている。却下されはしましたが、行儀のいい規格だと思います。

ただし、この構造には裏があります。APNGを知らないツールで再圧縮すると、拡張チャンクが丸ごと捨てられて、1コマ目だけのPNGになる。エラーも出ずに、動かないファイルができあがる。

関連:ココフォリアに上げたAPNGが動かない:容量1MBの壁


実際に作るとなると

理屈はこれで終わりですが、実際に透過APNGを作ろうとすると、動画編集ソフトを開いて、アルファチャンネル付きで書き出して、変換をかけて、という手順を踏むことになります。1回だけならまだしも、シナリオごとに文言を変えたい場合はかなり厳しい。

そこを短縮するために、文字とエフェクトを選ぶだけで透過APNGを書き出せるツールを作りました。ブラウザでHTMLを開くだけのローカルツールです。

無料版があります。まずはこれで、自分の環境でAPNGがきちんと透過するかを確認できます。

▶ カットインメーカー 無料版(¥0)
https://komagomadou.booth.pm/items/8638452


関連記事


参照元

  • Wikipedia「APNG」「GIF」

  • TechCrunch、2013年の記事(APNGがiOS 8で採用された件を扱ったもの)

いいなと思ったら応援しよう!