boost::gilでpng画像を操作する プロジェクトへの追加、サンプル作成編
boost::gilでpng画像を操作する インストール編 - モデラート - C#とゲーム開発と雑記の続き
VisualStudioでコンパイルを通す、警告を消してしまう話とサンプルコードです。
※各ライブラリがc:\にインストールされているとして書きます。
パスを追加
プロジェクトのプロパティを出して、左上の構成のリストボックスですべての構成を選ぶといいです。
追加のインクルードディレクトリ([構成プロパティ]->[C/C++]->[全般])
c:\boost\boost_1_44_0
c:\libpng
c:\zlib
追加の依存ファイル([構成プロパティ]->[リンカ]->[入力])
c:\libpng\projects\visualc71\Win32_LIB_Release\libpng.lib
c:\libpng\projects\visualc71\Win32_LIB_Release\ZLib\zlib.lib
Win32_LIB_Releaseはビルドターゲットごとに変えたほうがいいです。
それぞれ追加します。
エラーと警告抑制
>warning LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
[構成プロパティ]->[リンカ]->[コマンドライン]の追加のオプションに以下のテキストを追加します
構成ごとに設定してください。
/NODEFAULTLIB:LIBCD.lib /NODEFAULTLIB:MSVCRT.lib
libpng1.4からいくつかの定義がなくなったようで、boostのヘッダをincludeする前に下記の定義が必要です。
#define png_infopp_NULL (png_infopp)NULL #define int_p_NULL (int*)NULL
また、古い関数が使用されているために警告が出るので抑制します。
#pragma warning(disable:4996)
以上を踏まえてサンプルコード
サンプルコード
png画像を読み込み、黒で不透明なピクセルを青に置き換え出力するサンプルです。
#define png_infopp_NULL (png_infopp)NULL #define int_p_NULL (int*)NULL #pragma warning(disable:4996) #include <iostream> #include <boost/gil/gil_all.hpp> #include <boost/gil/extension/io/png_io.hpp> using namespace std; using namespace boost::gil; int _tmain(int argc, _TCHAR* argv[]){ argb8_image_t src; try{ png_read_image("input.png", src); }catch(ios_base::failure& e){ cout << e.what() << endl; return 1; } argb8_view_t v(view(src)); argb8_view_t::xy_locator src_loc = v.xy_at(0,0); for(int y=0; y<src.height(); y++){ argb8_view_t::x_iterator src_it = v.row_begin(y); for(int x=0; x<src.width(); x++){ if( src_it[x] == argb8_pixel_t(255,0,0,0) ){ src_it[x] = argb8_pixel_t(255,0,0,255); } } } string s("result.png"); png_write_view(s, v); return 0; }
動かない場合はフィーリングで(ry
argb8を色々変えるといいです。
string s("result.png");がわざわざstringなのに理由はありません。試してみただけです。
各ピクセルの特定成分を調べるには、たとえばargb8_pixel_tから赤色を取得するには以下のようにします。
int r = get_color(src_it[x], red_t());
もしくは
int r = at_c<1>(src_it[x]);
ピクセル操作はこんな感じかな?
アドビのチュートリアルは気が向いたらやろうかな・・・