I am Charmie

メモとログ

libtiff

libtiff.名前通り,TIFFを扱うためのライブラリ.Windoes用はこちら
Complete package, except sourcesからインストール用exeを落とせるから,おとなしくインストールexeを使うと楽.
ふと気づいたんだけど,これだけ時間がかかって,画像の読み込みしか知らない・・・いったい何なんだ.

libtiffを使ったTIFF画像のロードの簡単な流れ.3->4の流れが意味不明.

  1. TIFF画像をオープン
    画像をオープン.
  2. タグ(TIFF画像の情報)を取得
    TIFFは一つのフォーマットで色々なデータの保持の仕方をするので,そこら辺の情報を取得する.
    • SAMPLESPERPIXEL
      1ピクセルあたりの色数
    • BITSPERSAMPLE
      1ピクセルあたりのビット数(e.g., 8bit,16bit)
    • ROWSPERSTRIP
      1ストリップあたりの行数(数行をまとめて1ストリップとする事があるみたい).
    • ORIENTATION
      画像の原点.
    • PHOTOMETRIC
      画像の分類
      • 0: モノクロ
      • 1: グレースケール
      • 2: RGB
      • 3: インデックスカラー
      • 6: YCbCr
  3. 画像のラインを取得
    画像の1ラインをバッファに格納.
  4. 画素値を取得
    バッファから1画素の画素値を取得.
  5. TIFF画像をクローズ
    閉じる.
ソースはこんな感じ.

uint16 nSample, nBits, nPlan, nPhoto, nOri, pix;
uint32 nWidth, nHeight, nRows, size, raster, i, j;
TIFF
tif = TIFFOpen("charmie.tif","r"); // 画像オープン

// ここからタグ取得
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &nWidth);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &nHeight);
TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &nSample );
TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &nBits );
TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &nRows );
TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &nPlan );
TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &nPhoto );
TIFFGetField(tif, TIFFTAG_ORIENTATION, &nOri );
size = TIFFScanlineSize(tif);
raster = (uint32 )_TIFFmalloc(size * sizeof(unsigned long));
for(i = 0; i
{
TIFFReadScanline(tif, raster, i, 0); // ラインをバッファに格納
for(j = 0; j
{
pix =
*1; // 画素値を読み込む
}
}

// 全部閉じる
_TIFFfree(raster);
TIFFClose(tif);

書いて分かるけど,全然難しいコードじゃない.何か自分にがっかり.
8bitデータであれば,TIFFReadRGBAImageで,画像データ全体を一度バッファに格納すればOKっぽい.
とりあえず疲れた.

*1:unsigned int *)(raster + j