■開発環境
VC++6.0,Windows2000 Pro,+ libtiff(TIFFを扱うライブラリ)
で以下のようなコードを書きました.
*************************************************
BOOL CTiff::OpenTiffAndSaveBMP(CString path)
{
HDIB hDIB;
hDIB = LoadTIFFinDIB(path);
BITMAPFILEHEADER BMPFILEHEADER;
LPBITMAPINFOHEADER BMPINFOHEADER;
if(!hDIB)
return FALSE;
CFile file;
path.Replace("tif", "bmp");
if( !file.Open( path, 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;
}
************************************************
しかし,OpenTiffAndSaveBMP()の下から3行目の
>file.Write( BMPINFOHEADER, nSize );
でDebug Assertion Failed!なるエラーで止まってしまいます.
そこで「無視」ボタンを押すと「ファイルにアクセス中に不明なエラーが発生しまし
た」となります.
文字数の制限上LoadTIFFinDIB()のソースは無いのですが,
原因ならびに解決策の分かる方ご教授ください.
No.2ベストアンサー
- 回答日時:
GlobalSize(hDIB)としているならグローバルメモリなんでしょう。
hDIBがポインタとは限らないので、GlobalLock() でメモリブロックへのポインタを得てからキャストする。
BMPINFOHEADER = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
この回答への補足
ご回答ありがとうございます.
上記のやり方でエラーで止まることなくプログラムは走りました.
しかし,保存されたビットマップはペイントで開くと,
元がどんなTIFF画像であろうと真っ白になってしまいます.
これの原因について分かる方ご教授お願いします.
No.7
- 回答日時:
LoadTIFFinDIB() の BitsPerSample, PhotometricInterpretation の定義は
uint16 でないといけないのに、VC++ default では、
32bits になりますね。
tiff2dib.c の作者は自分の tiff data 向けに作ったものでしょう。
canon の tiff を処理したいのなら、スペックを把握して
範囲を限定して進めた方がよさそうです。
因みに tiff2dib.c でうまく行くのは、pics フォルダの
jello.tif のみでした。
わざわざそのようなことまで調べて、アドバイスしていただきありがとうございます。
16ビットのTIFFを読みたかったんですけど、難しそうですね。
もうすこしがんばってみます。
No.6
- 回答日時:
libtiff3.dll の入った libtiff で、tiff2dib.c を
libtiff ソースの pics フォルダの .tif ファイルで試したのですが、
.bmp ファイルで取り出せない例が出ます。
取り出せても、真っ黒あるいは真っ白。
libtiff3.dll は、2004.2.11 付けで、
tiff2dib.c は、1995.4.12 付けです。
tiff2dib.c はフランスの方が win95 向けに作ったものですが、
何かが、整合していないようです。LoadTIFFinDIB() の中の
memcpy() で落ちる例がありました。
仕様書に立ち戻った精査が必要な予感がします。
この回答への補足
今自分でもやってみたところ,PhotoShopを使って作成したTIFFなら読めますが,
Canonのカメラで撮ってCanonのソフトでTIFFにしたものでは確かにmemcpy()で落ちました.
後者のCanonのものはPhotoShopでも開くことができなかったです.
「書類を開けません.これはTIFFファイルではありません,」
というエラーが出ます.けど,イメージングでは開きます.
TIFFフォーマットは共通ではないのですかねぇ・・・
No.5
- 回答日時:
libtiffは触ったことないのですが…
No.2補足より
>しかし,保存されたビットマップはペイントで開くと,
>元がどんなTIFF画像であろうと真っ白になってしまいます.
バイナリエディタで開いて正しいBmpファイルが書き込まれているか
確認してください。
No.1補足より、
>nSizeには値は入ってました.
>640×480の画像でnSize = 921640でした.
>これは多分あってますよね…??
640*480 =307200
640*480*3=921600
このことからおそらくsizeof(BITMAPINFOHEADER)=40で
各ピクセルに3バイト(24ビット)、
カラーテーブルなしのビットマップを
LoadTIFFinDIBが作成したと推測しました。
カラーテーブルなしのため、
>BMPFILEHEADER.bfOffBits = (DWORD)(sizeof( BMPFILEHEADER ) +
>BMPINFOHEADER->
>biSize + nColors * sizeof(RGBQUAD));
のnColors * sizeof(RGBQUAD))は余分です。
#通常の24ビットBmpファイルのbfOffBits部分に2^24*4を
加算するとペイントでは真っ白の画面が出力されるようになります。
No.3
- 回答日時:
様子が分からないので、探してやっと tiff2dib.c を落としてきました。
#2さんがご指摘の BMPINFOHEADER へ入れるところで、
GlobalLock() がないと、hDIB が示す場所が不定です。
tiff2dib.c の CreateDIB() をご覧になると、hDIB の
内容が分かると思います。ヘッダを格納するところで、
GlobalLock() やってますよね。
尚、この関数の最後に hDIB を解放しないといけません。
>様子が分からないので、探してやっと tiff2dib.c を落としてきました。
わざわざありがとうございます.
hDIBは最後にちゃんと解放します.
今はまた下の補足のように別件で悩んでます.
なかなかゴールまでたどり着けません・・・
No.1
- 回答日時:
nSizeの値はちゃんと入ってますか?
GlobalSize()で取れるのかなぁ?
不精しないでsizeof(BITMAPINFOHEADER) + ビット列のバイト長にしないといけないのでは?
#変数名を大文字だけで書くのはやめたほうが。
非常に見づらいです。
特にBMPINFOHEADERがポインタなのに・・・
この回答への補足
ご回答ありがとうございます.
nSizeには値は入ってました.
640×480の画像でnSize = 921640でした.
これは多分あってますよね…??
デバッグしてみると,どうやらhDIBがBITMAPINFOHEADERの先頭を指してないみたいなのですが,
原因はそれですよねぇ…
hDIBがいったいなにを指しているのかわかりません.
LoadTIFFinDIB()が返すものは何なのでしょう…??
分かる方ご教授ください.
>#変数名を大文字だけで書くのはやめたほうが。
>非常に見づらいです。
>特にBMPINFOHEADERがポインタなのに・・・
気をつけます.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
SGファイルって何ですか?
-
csvファイルを開かずに文字を検...
-
VBに、Cのincludeのようなもの...
-
テキストファイルの最終行を削...
-
【C&C++】指定行のみファイル書...
-
大きいサイズのテキストファイ...
-
ファイル名の先頭にアンダース...
-
VC++の外部依存関係
-
バッチで118項目のCSVを処理し...
-
fopenの"r+"モードで同時に読み...
-
PDFを全文検索するプログラム
-
iniファイルに追記がしたいです。
-
音を出す方法
-
CSVファイルへの保存の際、デー...
-
Excelマクロでの再読込み方法
-
ASP .NETでファイル選択ダイア...
-
リエントランスな関数
-
アプリケーション終了時例外エ...
-
VBSでファイルを開く
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
Excelマクロでの再読込み方法
-
テキストファイルの最終行を削...
-
C言語のfopenについて教えてく...
-
ASP .NETでファイル選択ダイア...
-
CSVファイルへの保存の際、デー...
-
SGファイルって何ですか?
-
VBに、Cのincludeのようなもの...
-
VBAにてEXCEL以外のファイル(テ...
-
アプリケーション終了時例外エ...
-
大きいサイズのテキストファイ...
-
fopenできる上限の変更
-
ドラッグアンドドロップでファ...
-
分割コンパイルの#defineについて
-
バッチで118項目のCSVを処理し...
-
【C#】リソースファイルの埋め...
-
マウスポインタの変更
-
XMLファイルの表示について
おすすめ情報