昨日から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でキャプチャした方が早かったかもしれない.
まあ,こっちのほうが応用も効くし,良しとしよう.