openFrameworksの作品をgifにする

昨日からoFをさわり始めて,Webに作品を上げたいと思った.
jsに変換するよりもgifに変換するほうがらくだと思った.
変換するためにどうするべきか調べたところ,ofxGifEncoderなるものあるとわかった.

前にも書いたんだけど,パスを通して使ってみるとofxGifEncoder.cppのLine51とLine56でエラーが出ている.
img.wとimg.hとimg.bppはprotectedだからダメ,という内容だった.それぞれgetWidth()とgetHeight()とimg.getPixelsRef().getBitsPerPixel()で書きなおした.
その他は特になにもなく,普通に使えた.
 
自分で使ってみたときのコードはこれ
※パスとか.vcxprojのパス部分とか書き換えないと動かないと思う.あとVS2015で.
 
使い方は,まずパスを通す.
うまくできなかったら.vcxprojをいじって追加する.
 
使うプログラムのヘッダで,ofxGifEncoder型の変数を宣言する(ここではgifEncoderとする).
setupを以下のようにする.

void ofApp::setup() {
	/*---いろいろな処理---*/
	gifEncoder.setup(ofGetWidth(), ofGetHeight());
	gifEncoder.setDitherMode(OFX_GIF_DITHER_NONE);
	ofAddListener(ofxGifEncoder::OFX_GIF_SAVE_FINISHED, this, &ofApp::onGifSaved);
}

次に,drawを以下のようにする.ここでは,フレームレートを60とし,3秒ごから6秒後まで0.1秒刻みでフレームを撮っている.
if()の中の数字を色々いじれば好きに撮ることができる.

void ofApp::draw() {
	/*---描画処理---*/
	if (ofGetFrameNum()>=180&&ofGetFrameNum() % 6 == 0) {
		captureFrame();
	}
	if (ofGetFrameNum() == 360) {
		gifEncoder.save("result.gif");
	}
}

captureFrame()を追加する.ここで保存する範囲を指定することもできる.

void ofApp::captureFrame() {
	ofImage img;
	img.grabScreen(0, 0, ofGetWidth(), ofGetHeight());
	gifEncoder.addFrame(img);
}

 
最後に,onGifSavedを追加する.保存するときのメッセージが不要であれば,onGisSavedとsetupの中の5行目(ofAddEventListenner)はいらない.

void ofApp::onGifSaved(string &fileName) {
	cout << "gif saved as " << fileName << endl;
}

 
自分は適当なgifが撮れればよかったので,ofxGifEncoderを使ったが,普通にウィンドウをgifでキャプチャした方が早かったかもしれない.
まあ,こっちのほうが応用も効くし,良しとしよう.