WPF で APNG を表示する

DevelopmentAPNG, WPF

.NET Framework WPF で APNG (Animated PNG) を表示しようとしたところ、ドンピシャなライブラリー等が見つからなかったので、C# 製 ライブラリーを fork して用意しました。

細かな仕様の部分で間違いやバグがあるかもしれませんが、自分用にはとりあえず使えるものができました。control ではないので Image control に表示するには、今のところコードビハインドでコード記述が必要です。

画像クリックで APNG の表示

APNG の仕様について少し

APNG は、ファイル内に複数の PNG 画像があるようなフォーマットです。ただ、差分データによるアニメーションを実現できる仕様のため、単にファイル内の PNG 画像を取り出すだけはなく、画像の合成が必要です。デコードするだけでなく、この点も実装する上で手間ですね。

APNG を構成する各 PNG 画像。ベースの画像と瞬きの差分データ。

既存の APNG のライブラリー等について少し

C#, WPF で使えそうなライブラリーを検索すると次のようなものが見つかりました。

  • GitHub - xupefei/XamlAnimatedPng: A simple library to display animated PNG (i.e., APNG) images in WPF and UWP
    • Animated GIF を WPF 等でサポートするライブラリー作者による APNG 用ライブラリーのようですが、fork しただけで実装がないようです。
  • ttp://apngwpf.codeplex.com/ ※ Google Chrome ではブロックされるため URL 表記のみ
    • サービスが終了した CodePlex で公開されていた WPF 向けの APNG ライブラリー。C++/CLI 製で libpng を利用している模様。LGPL ライセンス。環境が古く、作者名等も不明なため使いませんでした。libpng を利用しているので、フレーム画像の合成などもきちんと動いているのかも。
  • APNG Viewer - CodeProject
    • C# 製。フレーム画像が差分データの場合が、考慮されていませんでした。

そして、上記ひとつ目の作者 xupefei 氏が、公開しているライブラリー APNG.NET。これを fork しました。

APNG.NET for WPF

C# 製のライブラリー APNG.NET を使い、WPF 用の拡張メソッドを作っています。

APNG を BitmapSource に変換

合成済みのフレーム画像を BitmapSource オブジェクトとして取得します。

APNG を Image control に表示

APNG からキーフレームアニメーションを生成し Storyboard を使ってアニメーションを表示します。

DevelopmentAPNG, WPF

Posted by jz5