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]);


ピクセル操作はこんな感じかな?


アドビのチュートリアルは気が向いたらやろうかな・・・