加賀一稿一記

心は戦国

C++とOpenCVでアニメーションpng

最近のpngはアニメーションに対応しているらしい.
(最近のブラウザがapngに対応してきたと言うのが正しい?)
OpenCV動画を出力できるが,apngはどうなんだろう.
どうせなら自分で書いてしまおう.と,ロクに調べもせずにコードを書いた.

書いたコードはこちら.
github.com
バイナリに明るくないので,大変苦労した.
(でも画像データの圧縮自体はOpenCVがやってくれるので,pngバイナリを読んでツギハギするだけで済んだ.)
cvAPNG.hをインクルードすれば,次のようなコードが書ける.

#include "cvAPNG.h"

int main(){

  cvAPNG apng;
  for (int i = 0; i < 256; i++){
    cv::Mat img(256, 256, CV_8UC3, cv::Scalar(255, 255, 255));
    cv::circle(img, cv::Point(i, i), i, cv::Scalar(i, i, i), -1);
    apng.push(img);
  }
  apng.write("result.png");

  return 0;
}

結果画像をここに貼りたかったけれど,画像アップロードの際にアニメーションが失われる?っぽいので,先ほどのgithubの下の方をご覧ください.

apngはgifと違ってフルカラーな画像を扱える点が強みですが,適当に作るとファイルサイズが大きくなってしまう.
賢く実装すればイラストアニメをいい感じに圧縮できそうだけれど,利用できるwebサービスが少ない気がするし何ともなあ.