常に、画像処理(圧縮アルゴリズム、フィルターなど)が大きな注目を集めました。 残念ながら、その作業は実際には画像処理やプログラミング全般とは関係ありません。 それにもかかわらず、私の愛するビジネスへの関心は衰えていません。したがって、最近オープンしたCImgライブラリに注目したいと思います。
CImgは、クラスと画像処理機能を提供するC ++ライブラリです。 これらは両方とも基本機能(ロード、保存、表示)であり、サイズ変更/回転、エフェクトの適用、オブジェクト(テキスト、ライン、サーフェス、楕円など)のレンダリングなどのアルゴリズムです。
ライブラリー構造
ライブラリは、 CImgのすべてのクラスと機能を含む1つのヘッダーファイルCImg.hで構成されています。 これはライブラリの特徴であり、いくつかの利点があります。
- CImg.hを含むメインプログラムのコンパイル中にCImgコードがコンパイルされるため(トートロジーについてはごめんなさい:-)、ライブラリを事前にコンパイルする必要はありません。
- 複雑な依存関係の欠如:プロジェクトにCImg.hを含めるだけです。
- コンパイルはオンザフライで実行されます。プログラムで使用される機能のみが実行可能ファイルに含まれます。 これにより、非常にコンパクトなアプリケーションを作成できます。
- クラスのメンバーと関数はインライン化され、プログラム実行中のパフォーマンスが向上します。
CImgライブラリの構造は次のとおりです。
- ライブラリのすべてのクラスと関数はcimg_library名前空間で定義されます。これにより、ライブラリの機能全体がカプセル化され、他のヘッダーファイルがプロジェクトに追加されるときに発生する可能性のある衝突が回避されます。 通常、この名前空間のみを標準として使用します。
#include "CImg.h" using namespace cimg_library;
- cimg_library :: cimg名前空間は、ライブラリで使用される低レベルの関数と変数のセットを定義します。
- cimg_library :: CImg <T>クラスはメインライブラリクラスであり、そのインスタンスはテンプレートピクセルタイプで最大4次元(1次元スカラーから3次元ピクセルセットまで)のエンティティ(イメージ)を表します。
- cimg_library :: CImgList <T>クラスは、cimg_library :: CImgイメージのリストを表します。 たとえば、一連の画像(フレームなど)を保存するために使用できます。
cimg_library :: CImgDisplayクラスは、グラフィカル環境で画像または画像のセットを表示します。 このクラスのコードはシステムに大きく依存していると安全に言うことができますが、実際には、プログラマーには関係ありません。 環境変数はCImgライブラリを介して自動的に設定されます。
cimg_library :: CImgExceptionクラス (およびそのサブクラス)は、エラーが発生した場合に例外を処理するためにライブラリによって使用されます。 例外は、try {..} catch(CImgException){...}を使用して処理されます。 サブクラスを使用すると、エラーの種類を正確に判断できます。
これら4つのクラスの知識は、CImgライブラリの機能を最大限に活用するのに十分です。
こんにちは世界!
まあ、大丈夫、かなりたくさん言われています。 CImgを使用して作成された基本プログラムがどのように機能するかについて、より視覚的な例を検討しましょう。
#include "CImg.h" using namespace cimg_library; int main() { CImg<unsigned char> img(640,400,1,3); img.fill(0); unsigned char purple[] = { 255,0,255 }; img.draw_text(100,100,"Hello World",purple); img.display("My first CImg code"); return 0; }
プログラムの各行をより詳細に検討してみましょう。
CImgライブラリのヘッダーファイルを接続します
#include "CImg.h"
型宣言を容易にするためにcimg_library名前空間を使用します
using namespace cimg_library;
プログラムの主な機能を宣言する
int main() {
サイズ640 * 400 * 1ピクセル(サイズが640 * 400 * 1ピクセル)の、 unsigned charピクセルタイプのイメージインスタンス-imgを作成しましょう(この場合、1はイメージが3次元ではなく平坦であることを意味します)。 各ピクセルには、赤、緑、青の3つのチャンネルがあります。 これは、コンストラクターの最後のパラメーターによって示されます。
CImg<unsigned char> img(640,400,1,3);
画像を黒で塗りつぶします(「0」は黒を意味します)
img.fill(0);
変数を紫と宣言します:色になります
unsigned char purple[] = { 255,0,255 };
画像のポイント(100,100)からテキスト「Hello World」を紫色で引き出します
img.draw_text(100,100,"Hello World",purple);
「最初のCImgコード」というタイトルの画像をグラフィックスウィンドウに表示します
img.display("My first CImg code");
プログラムを終了する
return 0;
ご覧のとおり、CImgライブラリは非常に使いやすく、メソッドの名前は直感的です。 上記のコードはさらにコンパクトに書くことができますが:
#include "CImg.h" using namespace cimg_library; int main() { const unsigned char purple[] = { 255,0,255 }; CImg<unsigned char>(640,400,1,3,0).draw_text(100,100,"Hello World",purple).display("My first CImg code"); return 0; }
スクリーンショット(クリック可能):
将来、さらに複雑な、さらに複雑な例をいくつか分析することを願っています!
プロジェクトサイト: cimg.sourceforge.net
ご清聴ありがとうございました!
PS
- Linuxでは、次のコマンドでコンパイルされます。
g++ -o hello hello.cpp -O2 -L/usr/X11R6/lib -lm -lpthread -lX11
(-O2なしでも実行できます) - 十分な長さのコンパイル(Linux Gentoo、Pentium®デュアルコアCPU T4500 @ 2.30GHz):
$ time g++ -o hello hello.cpp -O2 -L/usr/X11R6/lib -lm -lpthread -lX11
real 0m28.397s
user 0m27.991s
sys 0m0.265s
28秒(!) Hello、World!の場合 じゃないですか? 「-O2」なしでは3倍高速になりますが。 - バイナリのサイズは742Kで、一般にコンパイル時間に匹敵します!
- Linuxでは、次のコマンドでコンパイルされます。