iplConvertFromDIB(bif1, img1);でLPBITMAPINFOHEADER bif1のBMPを内部形式に変換する。
ドキュメントには、イメージデータを事前にアロケートしなくても動作するようなことが書いてあるけど、アロケートしないとエラーをくらった。
ヘッダーとデータが連続していないDIBだと落ちるので注意。連続していないDIBを扱うには、Ver2のiplConvertFromDIBSep(ヘッダポインタ、データポインタ、IPLヘッダー)を使う。色数その他はDIBがどうなっていても、IPLヘッダーに指定したものに変換される。
IPLイメージが32ビットの場合は、DIBが32ビットの場合はそのαチャンネルがセットされるが、その他の場合、αチャンネルは0のまま(255で埋められたりしない)ので注意。
Ver2.5にはiplConvertFromDIBSep()という、データ部を分離して指定できるAPIが出来ました。
// 以下はCreateImageHeaderのパラメータ αチャンネル付き24bit画像
int nChannels = 4; //イメージ内のチャンネル数.ここでは4
int alphaChannel = 4; //αチャンネルは何番目のチャンネルか。ここでは4番目
int depth = IPL_DEPTH_8U; //各チャンネルは何ビットか。ここでは8ビット
char* colorModel="RGBA"; // カラーモデル"RGB","GRAY","MSI"
char* channelSeq="BGRA"; // チャンネルの並びの順
int dataOrder=IPL_DATA_ORDER_PIXEL;
//int dataOrder=IPL_DATA_ORDER_PLANE;
int origin=IPL_ORIGIN_TL; //データの並び方 TLは左上から始まる.BLなら左下から始まる
int align=IPL_ALIGN_DWORD;
// int align=IPL_ALIGN_QWORD; // Ver1ではサポートされていないので要注意
int width;
int height;
IplROI* roi=NULL; // ROIは使わない
IplImage* maskROI; // Ver2.0用のマスク
void* imageId=NULL; // 使わない
IplTileInfo* tileInfo=NULL; //使わない
img1 = iplCreateImageHeader(
nChannels, alphaChannel, depth,
colorModel, channelSeq, dataOrder,
origin, align,
bif1->biWidth, bif1->biHeight, roi, // Ver2.0ではここにmaskROIが入る
imageId, tileInfo);
iplAllocateImage(img1, 埋める数字(0xffffffffなら埋めない));
// iplAllocateImage(img1, 埋める/埋めない(0), 埋める数字); // Ver2では、0xffffffffで埋めることが出来る。