画像の入出力 - mist-team/mist GitHub Wiki
はじめに
MISTでは,画像を簡単に読み込んだり出力したりする機能を提供しています. サポートしている画像形式は,JPEG,TIFF,PNG,BMP,PNM,GIF,TGA, RAW,DICOM の9種類です. ここで,JPEG,TIFF,PNG,RAWには以下に示す外部ライブラリが必要となります. 利用する際には,これらのライブラリの準備を行ってください.
- JPEG … Independent JPEG Group (http://www.ijg.org/) が提供する libjpeg ライブラリ
- TIFF … http://libtiff.org が提供する libtiff ライブラリ
- PNG … http://libpng.org が提供する libpng ライブラリ, http://www.zlib.org が提供する zlib ライブラリ
- RAW … http://www.zlib.org が提供する zlib ライブラリ
ヘッダの準備
まず,読み込みたい画像の形式によって,インクルードするヘッダファイルを決めます.
JPEG
#include <mist/io/jpeg.h>
TIFF
#include <mist/io/tiff.h>
PNG
#include <mist/io/png.h>
RAW
#include <mist/io/raw.h>
GIF
#include <mist/io/gif.h>
TGA
#include <mist/io/tga.h>
BMP
#include <mist/io/bmp.h>
PBM, PGM, PPM, PNM
#include <mist/io/pnm.h>
上記のヘッダは,それぞれの画像形式に特化したものです. 全ての画像形式を,拡張子で判定して読み書きする関数は次のヘッダで提供しています.
#include <mist/io/image.h>
画像の読み込み
前回のチュートリアルで述べたと思いますが,画像を格納するオブジェクトを次のような感じで用意します.
mist::array2< unsigned char > image; // <- グレースケール画像として読み込む
mist::array2< mist::rgb< unsigned char > > image; // <- カラー画像として読み込む
ここで,BMP画像を読み込みたい場合は #include <mist/io/bmp.h> をインクルードして,必要なところで次のように書けばOKです.
mist::read_bmp( image, "入力BMPファイル名" );
また,全てのサポートしている画像形式を拡張子で判別して読み込むなら
mist::read_image( image, "入力画像ファイル名" );
と書くだけでOKです.ここで,各関数の戻り値として画像が正しく読み込まれたかどうかを返します. これを利用して,読み込みに失敗したかどうかを調べるには次のように書くだけでOKです.
if( mist::read_image( image, "入力画像ファイル名" ) )
{
std::cout << "読み込みに成功!!" << std::endl;
}
else
{
std::cout << "読み込みに失敗!!" << std::endl;
}
もし,元データがカラー画像で読込先のコンテナがグレースケール(mist::array2< unsigned char >)であった場合は,自動的にグレースケールに変換されます.
画像の書き込み
画像の書き込みと画像の読み込みはほとんど同じ手順で実行でき,こんな感じで書けます.
if( mist::write_image( image, "出力画像ファイル名" ) )
{
std::cout << "書き込みに成功!!" << std::endl;
}
else
{
std::cout << "書き込みに失敗!!" << std::endl;
}
}
write_image 関数では,画像に出力する際のパラメータ(画質,圧縮率,...)を指定することはできません. そこで,MISTではBMP画像やJPEG画像専用の書き込み関数も用意しています. 専用の関数では,画像の圧縮率や品質などのパラメータを指定することができるので,利用したい画像用の書き込み関数を調べて利用してください.
画像入出力のサンプル
// MISTの一番メインとなるヘッダファイル
// 1・2・3次元画像を扱うコンテナが用意されてます
#include <mist/mist.h>
// ファイルから画像を読み込んでMISTで提供するコンテナにデータを格納します
// サポートされている形式は
// JPEG, PNG, TIFF, BMP, PNM です
#include <mist/io/image.h>
int main( int argc, char *argv[] )
{
// mist::???? という風にMISTは ''mist'' という名前空間で囲まれています
// (C++の知識が必要?なければおまじないだと思って・・・)
// MISTは全てC++のtemplateの機能を利用して作成されてます.
// なので,2次元画像といってもいろんなデータ型が作成できます
// (例えばグレースケールだったりカラーだったり・・・).
// まずは,画像のデータ形式がどんな物かを決めます(重要です!!)
typedef mist::rgb< unsigned char > value_type; // 画像の要素がRGBの3成分からなるようにします
typedef mist::array2< value_type > image_type; // RGBが要素となる2次元画像の設定
image_type img; // 画像の実体を作ります(プログラムミスを考えて,newで確保するのは控えめに・・・).
if( !mist::read_image( img, "読み込むファイル名を設定します" ) )
{
// ファイルが読めないみたい・・・
return( 1 );
}
// img に画像が読み込まれてるはずなので,なんか処理してください
mist::write_image( img, "書き出すファイル名を設定します" );
return( 0 );
}