Firefox、Opera、およびWebKitでのPNGのアニメーション? 簡単!

かつて退屈から、8ビットの透明度を持つ美しいフルカラーアニメーションを作成したかった。 GIFがこの目的に適していないことは明らかであり、代替手段を探し始めました。 Flashはその品質でさえ考慮されていませんでした-プロセッサが重すぎて、ページの他の要素の上にうまく収まらず、誰もが持っているわけではありません。



まず、PNGの親aであるMNGに目が行きました。 「フォーマット仕様は2001年にリリースされたため、おそらくすべての最新のブラウザーに実装されています!」 そして、最初の失望が私を待っていました。 このフォーマットは実装するには複雑すぎるため、Mozillaの実装には、他のすべてのフォーマットと同じ数のコード行が含まれていたため、製品から削除されました。 他のブラウザメーカーは、この形式を実装しようとしてさえいないようです。 もちろん、Netscapeプラグインをサポートするブラウザー用のプラグインがありますが、これはFlashよりも優れています。 おそらく、形式が時代を先取りしすぎていることに注意してください。 フィーチャの説明から判断すると、これはこのようなラスターSVGです。



さらに検索すると、APNG形式になりました。 形式は2ルーブルのように単純です。ファイルには、いくつかの小さなニュアンスのある前のフレームからのフレームの変更が含まれています。 しかし、最も重要なことは、この形式をサポートしていないブラウザは静的な画像を表示することです。 一般に、形式の機能はGIFに似ています。 Mozillaによって、巨大なMNGの代替として提案されました。 Firefoxでのチェック-すべて正常に動作します。 オペラも。 Chromeで開いて...静止画像を取得します。 何が起こったのか:Mozillaは、PNG仕様にAPNGを含めることを提案しました。 投票により、このアイデアは拒否されました。 現在、この形式をサポートしているブラウザとサポートしていないブラウザがあります。



写真は私の前にはっきりと現れました。

Mozilla:あなたのフォーマットは悪いです、あなたはアニメーションPNGで何も理解していません! 私たちはチェスや詩人なしで自分で作りました。 それを仕様に含めてください!

PNG開発グループ:どうぞ!



よくあることですが、人間のうぬぼれのせいで、私たちは10年も昔のGIFを楽しんでいます。



そして、アイデアが浮かんできました。ビットマップ画像をSVGに挿入できるようです。



山がモハメッドに行かない場合



実験のために、私はMozillaから写真を借りました:

Spinfox








画像を個別のフレームに分割します。

 1 2 3

などなど。 25フレームになりました。



最大フレームのサイズに等しいSVGのサイズを指定し、画像を挿入します。 ちなみに順序は重要ではありません。

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="148" height="148"> <image x="0" y="0" width="148" height="148" xlink:href="spinfox_001.png" /> <image x="0" y="0" width="148" height="148" xlink:href="spinfox_002.png" /> <image x="0" y="0" width="148" height="148" xlink:href="spinfox_003.png" /><image x="0" y="0" width="148" height="148" xlink:href="spinfox_024.png" /> <image x="0" y="0" width="148" height="148" xlink:href="spinfox_025.png" /> </svg>
      
      





さらに、フレームを単純に順番に重ね合わせることを試みましたが、透明度を考慮せず、キツネの耳から太陽を取得しました(IE9でも同じ効果が見られます)。

太陽






この効果を使用して、APNGモードの1つを実装できます。前のフレームの上に次のフレームを描画します。



次に、opacityプロパティをアニメーション化します。 フレームをアニメーション化して調整し、フレームを見えないように移動できます。

ここでは、透明度がスムーズに変化し、ループまたはフリッカーが現れるという事実に問題が現れる場合があります。 このために、calcModeを「discrete」として指定します。

参照値のリスト:値= "1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0 ; 0; 0; 0 "。 ご覧のとおり、これが最初のフレームです。 最初の値は1-画像は透明ではありません。 他のすべてのフレーム-完全に透明。

アニメーションの継続時間(dur)は、フレーム数で割ったときに1フレームの時間が得られるように選択されます。 画面上でフレームの長さを2倍にする必要がある場合、参照値のリストを2倍にするか、1つの値の継続時間を変更する必要がありますが、これはやや複雑です。

 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="148" height="148"> <image x="0" y="0" width="148" height="148" xlink:href="spinfox_001.png"> <animate attributeType="CSS" attributeName="opacity" dur="1.25s" values="1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0" calcMode="discrete" repeatCount="indefinite" /> </image> <image x="0" y="0" width="148" height="148" xlink:href="spinfox_002.png"> <animate attributeType="CSS" attributeName="opacity" dur="1.25s" values="0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0" calcMode="discrete" repeatCount="indefinite" /> </image> <image x="0" y="0" width="148" height="148" xlink:href="spinfox_003.png"> <animate attributeType="CSS" attributeName="opacity" dur="1.25s" values="0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0" calcMode="discrete" repeatCount="indefinite" /> </image><image x="0" y="0" width="148" height="148" xlink:href="spinfox_024.png"> <animate attributeType="CSS" attributeName="opacity" dur="1.25s" values="0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0" calcMode="discrete" repeatCount="indefinite" /> </image> <image x="0" y="0" width="148" height="148" xlink:href="spinfox_025.png"> <animate attributeType="CSS" attributeName="opacity" dur="1.25s" values="0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1" calcMode="discrete" repeatCount="indefinite" /> </image> </svg>
      
      





不便な点は1つだけです。アニメーションは多くのファイルで構成されています。 SVGに画像を直接埋め込むことで、data:URLを使用してこの問題を解決します。



最終結果



元のAPNGのサイズ: 613321バイト。

SVGサイズ: 799692バイト;

SVG圧縮gzipのサイズ: 601409バイト。 オリジナルよりもさらに少ない!

PNGフレームはpngoutを使用して最適化されました。



注意深い読者は、この「秘密のテクニック」がIEで機能しないことに気付いているかもしれません。 彼にGIFまたはFlashを使って別のコードを渡し、IE10を待ってシャベルを準備することをお勧めします。



All Articles