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