• ベストアンサー

libtiffのLoadTIFFinDIB()の返すもの

TIFFのライブラリのlibtiffを用いてTIFF画像を読み込んで画像処理をしようと試みています。 そこで、libtiff内のtiff2dib.cファイルを参考にプログラムを書いています。 ここでわからないのですが、このtiff2dib.c内にあるLoadTIFFinDIB()関数の返すものは何ですか? HDIBという型で、これを辿っていくとvoid*でした。 何のハンドルなんでしょう? ソースもなく申し訳ないのですが、分かる方、ご教授お願いします。 ちなみに当方BITMAPについてはそんなに分かっていません。

質問者が選んだベストアンサー

  • ベストアンサー
  • mcWalker
  • ベストアンサー率69% (27/39)
回答No.2

VC++ をお持ちなら、ヘルプで MSDN を参照できるはず ですが、少し説明します。 WinGdi.h に BITMAPINFO があります。(コメントに DIB の語) これは、情報ヘッダとカラーパレットからなります。 この後にbiBitcountで指定の色データが並びます。 (色データのサイズは biSizeImage で分かります  カラーパレットは、biClrUsed = 0 なら、biBitCount  で決まる色数になりますが、それより少ないとき  は、biClrUsed で指定されます。  biCompression が 0 でなければ、BI_RLE4 や BI_RLE8 の  圧縮がかかっています。BI_JPEG などもあります。) HDIB は、BITMAPINFO の始まりを指して定義します。   情報ヘッダは、BITMAPINFOHEADER ですが、   最初の biSize が 0x0028 でなければ、別の版   のもです。(ファイル上は、2800 の並び) 情報ヘッダの biPlanes は通常 1 でしょう。 biXPelsPerMeter, biYPelsPerMeter は通常 0 ですが、 もし値が入っていても、描画では HDIB をそのまま 渡すので、気にする場合は少ないでしょう。 HDIB の前にファイルヘッダを付けると、xxx.bmp と いう名前のファイルにできます。ファイルヘッダの 構造体の名前は BITMAPFILEHEADER です。 DIB 取得の関数 GetDIBits() もあります。

mkmarimo
質問者

お礼

補足した質問は新たに質問しなおすことにしました。 ありがとうございました。

mkmarimo
質問者

補足

補足に対するご回答ありがとうございます。 >HDIB は、BITMAPINFO の始まりを指して定義します ということなので、ビットマップ関係のWEBを参考にして、 とりあえず保存しようと以下のようなコードを書きました。 HDIB hDIB; hDIB = LoadTIFFinDIB("C:\aaa.tif"); BITMAPFILEHEADER BMPFILEHEADER; LPBITMAPINFOHEADER BMPINFOHEADER; if(!hDIB) return FALSE; CFile file; if( !file.Open( "C:\aaa.bmp", CFile::modeWrite|CFile::modeCreate) ) return FALSE; BMPINFOHEADER = (LPBITMAPINFOHEADER)hDIB; int nColors = 1 << BMPINFOHEADER->biBitCount; // BITMAPFILEHEADERのフィールドを初期化 BMPFILEHEADER.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM" BMPFILEHEADER.bfSize = GlobalSize (hDIB) + sizeof( BMPFILEHEADER ); BMPFILEHEADER.bfReserved1 = 0; BMPFILEHEADER.bfReserved2 = 0; BMPFILEHEADER.bfOffBits = (DWORD)(sizeof( BMPFILEHEADER ) + BMPINFOHEADER-> biSize +nColors * sizeof(RGBQUAD)); // ファイルヘッダを書き込む file.Write( &BMPFILEHEADER, sizeof(BMPFILEHEADER) ); // DIBのヘッダとビット列を書き込む DWORD nSize = GlobalSize(hDIB); file.Write( BMPINFOHEADER, nSize ); file.Close(); return TRUE; ですが、最後から3行目のfile.Write( BMPINFOHEADER, nSize );でDebug Assertion Failed!なるエラーで止まってしまいます。 どこかおかしいでしょうか? こんなデバッグまで聞いてしまい、本当に申し訳ないですが、分かる方ご教授お願いします。

その他の回答 (1)

  • mcWalker
  • ベストアンサー率69% (27/39)
回答No.1

HDIB:構造体 DIB のハンドル header files に定義があるはず。 goo で、HDIB で検索すると、使用例が出てくる。 MSDN を入手すると、詳しい説明がある。 ひょっとすると、「猫でもわかる...」のどこかに説明があるかも。

mkmarimo
質問者

補足

ご回答ありがとうございます。 構造体DIBってのがあるのですか? 私はVisual C++6.0でプログラミングしているのですが、 BITMAPを扱うクラスを作っています。 そこに直接このHDIBから画像を入れたいのですが、よくわかりません。 HDIBはBITMAPの先頭アドレスを指すのですか?? BITMAPは ファイルヘッダ 情報ヘッダ カラーパレット 画素データ という順に情報があるとのことですが、 このどれかの先頭を指しているのですか?? わからずやですいません。

関連するQ&A