今週、 CImgライブラリの主要なメソッドの簡単な説明を行った記事を公開し、基本的な例を分析しました。 投稿は招待を目的としたものでしたが、それでも可能な限り参考になるようにしました。 実際、以前に計画され、 skorの要望を考慮して、私はCImgを使用して基本的なスクリーンセーバーを作成しようとすることにしました 。 面白くなってきました-キャットへようこそ!
まえがき
すぐに予約すると、プログラムはフルスクリーンセーバーの「タイトル」のふりをしません。 目標は、前述のライブラリを使用するより複雑な例を作成しようとすることでした。コード
// CImg #include "CImg.h" // #define PI 3.14 // std cimg_library using namespace cimg_library; using namespace std; // int main (int argc, char **argv){ // , // - , , , // CImg<float> logo, logo_layer_1 = CImg<>(800,600,1,1,0); // // "Welcome to CImg simple screensaver" logo_layer_1.draw_text(120,5,"Welcome to", CImg<>::vector(255).data(),CImg<>::vector(0).data(),1,128); logo_layer_1.draw_text(300,140,"CImg", CImg<>::vector(255).data(),CImg<>::vector(0).data(),1,128); logo_layer_1.draw_text(250,285, "simple", CImg<>::vector(255).data(),CImg<>::vector(0).data(),1,128); logo_layer_1.draw_text(120,425,"screensaver!", CImg<>::vector(255).data(),CImg<>::vector(0).data(),1,128); // logo_layer_1.blur(6); // logo_layer_1.normalize(0,255); // CImg<float> logo_layer_2 = CImg<>(logo_layer_1.width(),logo_layer_1.height(),1,1,0); // logo_layer_2.noise(80,1); // 2 logo_layer_2.deriche(2,0,'y',false); // 10 logo_layer_2.deriche(10,0,'x',false); // logo logo = logo_layer_1 + logo_layer_2 + logo_layer_1; // // , , get_gradient(), // "Compute the list of images, corresponding to the XY-gradients of an image" // - " , XY- " // CimgList // , CImgList<float> grad = logo.get_gradient(); // normalize (-140,140) cimglist_apply(grad,normalize)(-140,140); // logo logo.normalize(0,255); // , , "", // , logo CImg<float> light = CImg<>(300 + 2*logo.width(),300 + 2*logo.height()); // light.draw_gaussian(0.5f*light.width(),0.5f*light.height(),80,CImg<>::vector(255).data()); // CImg<unsigned char> img(logo.width(),logo.height(),1,3,0); // , CImgDisplay disp(img," ",true); // disp.toggle_fullscreen(false); float t = 0; // , 'ESC' 'Q' while (!disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC()) { int pos_x, pos_y, gx, gy; float val; // pos_x = (int)(img.width()/2 + img.width()*cos(1*t)/2); pos_y = (int)(img.height()/2 + img.height()*sin(3*t)/2); // cimg_forXY - , // - http://cimg.sourceforge.net/reference/group__cimg__loops.html cimg_forXY(img,x,y) { // , gx = (int)grad[0](x,y); gy = (int)grad[1](x,y); val = 20 + (gx + gy)/2 + light(light.width()/2 + pos_x - x + gx,light.height()/2 + pos_y - y + gy); img(x,y,0) = img(x,y,1) = img(x,y,2) = (unsigned char)(val>255?255:val<0?0:val); } t = t >= 2*PI ? 0 : t+0.02f; // disp.display(img.draw_image(0,0,0,1,logo,0.1f)); } return 0; }
観察
私の意見では、結論はあまり慰めではありません。マイナスのうち:
- 長時間コンパイルします。
- プロセッサ時間の最大90%を消費します。
- 十分に速いアニメーションではありません。
プロから:
おそらく1つだけが区別できます:- CImgは、「怠lazな」プログラミングのための成功したツールです。クラスのシンプルで直感的なインターフェイス、非常に膨大な機能(あらゆる種類のフィルターなど)。 非常に迅速にアプリケーションを作成できますが、残念ながら十分に軽量で生産的ではありません。
結論
CImgの研究のこの段階で、CImgは動的なシーンの作成にはあまり適していないことに注意したいと思います。 それでも、勉強を続けたいという願望がありますが、次の記事では、静的を扱う複雑な例を「噛む」ことを試みます。コメントや提案を待っています。
ご清聴ありがとうございました!
PS Linuxでのみテスト済み