差分
このページの2つのバージョン間の差分を表示します。
次のリビジョン | 前のリビジョン | ||
openframeworks:fbo_frame_of_buffer [2019/06/26 18:53] – 作成 baba | openframeworks:fbo_frame_of_buffer [2019/06/26 19:42] (現在) – baba | ||
---|---|---|---|
行 1: | 行 1: | ||
====== FBOを使う ====== | ====== FBOを使う ====== | ||
- | FBOとは Frame Buffer Object の略で、通常画面に描画するものを一旦こちらのバッファに貯め込むこと、いいことがあるよ、という機能です。具体的には. | + | FBOとは Frame Buffer Object の略で、通常画面に描画するものを一旦こちらのバッファに貯め込むこと、いいことがあるよ、という機能です。Frameとは、動画における1枚を指す言葉です。Bufferはなにか主たる処理をするために必要な一時記憶領域。Objectはモノをさし、描画した内容を1枚の画像として保存しておくことができます。具体的には. |
* 描画している任意の部分を画像に保存したい。 | * 描画している任意の部分を画像に保存したい。 | ||
* 描画しているある部分を切り出したい。 | * 描画しているある部分を切り出したい。 | ||
行 8: | 行 8: | ||
===== 描画している任意の部分を画像に保存したい ===== | ===== 描画している任意の部分を画像に保存したい ===== | ||
- | 例えば画面上にある画像を表示し、その上に任意の文字列を表示したサンプルがあるとします。画像自体はofImageで読み込みしているので、保存することは簡単にできますが、その上に描画されている任意テキストも一緒に、となるとちょっと難しくなります。例えばofに ofSaveScreen()なる関数が用意されているので、これを使えば画面にスクリーンショットを保存できますし、mac標準のスクリーンショット機能を使えば同様のことは可能です。一方で任意の場所に関して保存したい場合はfboが役に立ちます。以下のサンプルは画面上に sample.jpg を表示し、その上に "Hello ofFbo" | + | 例えば画面上にある画像を表示し、その上に任意の文字列を表示したサンプルがあるとします。画像自体はofImageで読み込みしているので、保存することは簡単にできますが、その上に描画されている任意テキストも一緒に、となるとちょっと難しくなります。例えばofに ofSaveScreen()なる関数が用意されているので、これを使えば画面にスクリーンショットを保存できますし、mac標準のスクリーンショット機能を使えば同様のことは可能です。一方で任意の場所に関して保存したい場合はfboが役に立ちます。以下のサンプルは画面上に sample.jpg を表示し、その上に "Hello ofFbo" |
+ | * {{ : | ||
+ | |||
+ | 適当なプロジェクトを作成して、下記のofApp.h, | ||
+ | <WRAP group> | ||
+ | <WRAP half column> | ||
+ | <code .h ofApp.h> | ||
+ | #pragma once | ||
+ | |||
+ | #include " | ||
+ | |||
+ | class ofApp : public ofBaseApp{ | ||
+ | public: | ||
+ | void setup(); | ||
+ | void update(); | ||
+ | void draw(); | ||
+ | void keyPressed(int key); | ||
+ | ofImage img; | ||
+ | ofFbo fbo; | ||
+ | }; | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <WRAP half column> | ||
+ | <code .cpp ofApp.cpp> | ||
+ | #include " | ||
+ | |||
+ | void ofApp:: | ||
+ | // sample.jpg を読み込む dataフォルダにおいておくことを忘れずに | ||
+ | img.load(ofToDataPath(" | ||
+ | |||
+ | // 読み込んだ画像サイズ分のfboサイズをメモリ確保する | ||
+ | fbo.allocate(img.getWidth(), | ||
+ | } | ||
+ | |||
+ | void ofApp:: | ||
+ | // fbo.begin()からfbo.end()の間に記述された描画内容がfboに保存される | ||
+ | fbo.begin(); | ||
+ | ofClear(0); | ||
+ | img.draw(0, | ||
+ | ofDrawBitmapStringHighlight(" | ||
+ | fbo.end(); | ||
+ | } | ||
+ | void ofApp:: | ||
+ | ofBackground(0); | ||
+ | |||
+ | // 0, | ||
+ | // update()内で描画した内容が表示される。 | ||
+ | fbo.draw(0, | ||
+ | } | ||
+ | void ofApp:: | ||
+ | if( key == ' | ||
+ | ofPixels p; | ||
+ | fbo.readToPixels(p); | ||
+ | |||
+ | // saved_image.jpgというjpgファイルを最高品質で補zんする | ||
+ | ofSaveImage(p, | ||
+ | |||
+ | // データフォルダをfinderで開く(terminalで open ./data を実行している) | ||
+ | ofSystem(" | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | 以上を実行し、キーボードの ' | ||