- ベストアンサー
BMP 仕様
言語:C++ 標準ライブラリのみ OS:Windows 以上の条件でビットマップを表示したいと考えています。 ただし、今後JPEGなど別フォーマットでも対応できるようにするためLoadImage関数などは使用しないものとします。 //ファイル読み込み ifstream in( fileName.c_str(), ifstream::binary); ~ //char* _data in.read( _data, _size ); //データ取得 unsigned long getUnLng( int Index ) const { //unsigned char* _unChar = _data; //データ単位がnバイトごとの場合は別に考慮する unsigned long unLng = _unChar[Index]; return unLng; } 上記で画像データは取得できるのですが、どこに何が入っているのかがわかりません。 Index = 0 の場合 B Index = 1 の場合 M などが取得できるのですが、これが何を意味しているのかを知りたいのです。 幅や高さ、色の情報がどこに存在するかの詳細は分かりませんでしょうか。 ----例 幅 :Index 10 ~ 13 高さ :Index 14 ~ 17 ・幅×高さが 2×3 の場合 色情報:Index 18 ~ 23 ---- 説明が下手で申し訳ありません。 ご指摘いただければ情報の補足はさせていただきますのでよろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 >てっきりBITMAPFILEHEADER等は単なるWindowsAPIの構造体かと。 「共通規格」として規定されたデータ構造を、利用しやすいように同じ名称で構造体定義しているものは他にもたくさんありますよ。 >データ構造に関しては以上の認識で宜しいでしょうか。 どちらかというと、「nバイト」の部分は「BITMAPFILEHEADERのオフセットバイト」と覚えていた方がいいです。 こういったデータのデータ構造可変の為、「ヘッダのサイズ」や「次のデータのオフセット位置」等で表す場合が多いですから。 >ご紹介いただいたデータ構造というのはビットマップ専用のものではないのでしょうか 基本、ビットマップ専用です。 これは他のデータのファイルを「バイナリエディタ」で除いた方がはっきりとわかりますよ。 >(jpeg、png等もこれと同じデータ構造で出来ている?) おそらく、「圧縮形式」のところが引っかかっているのでしょう。 あまり使いませんが、ヘッダだけbitmap形式で内部の画像データはJPEGということもできます。 ここでは説明は省きますが、興味があったら「RIFF」や「TIFF」のデータフォーマットも調べてみてください。
その他の回答 (5)
- titokani
- ベストアンサー率19% (341/1726)
>ただ2000以前の環境にアプリを導入した際、DLLの導入を要求してしまっては.NET等を使用しない理由が薄れてしまいます。 でしたら、OleLoadPictureはどうでしょうか。 Windows95から使えるようですし、いくつかサンプルもあるようです。
お礼
>でしたら、OleLoadPictureはどうでしょうか。 おお、これは使えそうですね。 若干参考サイトが少ないですが、利用してみたいと思います。 ありがとうございました。
- titokani
- ベストアンサー率19% (341/1726)
>言語:C++ 標準ライブラリのみ >定義に関して曖昧な部分が多いことは否定できません。 標準ライブラリは規格で決まっていますし、Win32APIは含みません。 >ただし、今後JPEGなど別フォーマットでも対応できるようにするためLoadImage関数などは使用しないものとします。 むしろ逆だと思います。JPEGを自前で読み込むのはえらい面倒です。 対応するライブラリを使うのが楽ですよ。 GDI+とかはどうでしょうか。
お礼
ありがとうございます。 >標準ライブラリは規格で決まっています 失礼しました。 曖昧というのは私がC++標準ライブラリの内容を正しく認識できていないという意味です。 >Win32APIは含みません。 初めに書いておくべきでした、重ねて申し訳ありません。 >GDI+とかはどうでしょうか。 このようなライブラリもあるんですね、勉強になります。 ただ2000以前の環境にアプリを導入した際、DLLの導入を要求してしまっては.NET等を使用しない理由が薄れてしまいます。 どこまで許容するかの問題なんですが、手間がかかるようであればGDI+の使用を考えてみようと思います。
- SilverThaw
- ベストアンサー率32% (260/806)
No.1です No.2 >このように定数定義しようと考えていたのですが、それでは問題ありますでしょうか。 使用方法さえきっちりと理解できていれば問題はないと思います。 但し、この定数を利用できるのは「それぞれのブロック(ヘッダ)」内だけです。 一番の理由は「データが必ずしも連独している必要がない」というところからです。 例えば1つ目のヘッダが「10byte」あるからと言って、次のヘッダが「11Byte目」からという保証はありません。 「オフセットの項目」が存在している場合、オフセットの値が「20」であれば「2ヌByte目(今のヘッダデータの次からnByteなら31Byte目)」となります。 この間にある「10Byte(もしくは20Byte)」はゴミデータとして処理する必要があります。 従って、「そのヘッダ内でのオフセット位置を表す」程度にとどめたほうがいいです。 WinAPIの構造体をそのまま利用できないのであれば、「同等の構造体」を定義するのも一つの手です。
お礼
ありがとうございます。 オフセットの意味を勘違いしておりました。 てっきり各項目からの相対位置的な意味合いかと。 >例えば1つ目のヘッダが「10byte」あるからと言って、次のヘッダが「11Byte目」からという保証はありません。 つまりファイルヘッダが14byteだからといって、情報ヘッダの開始地点が14byte目から、とは限らないということでしょうか。 ファイルヘッダのオフセット項目が20であれば 14 + 20 = 34 情報ヘッダの開始地点は34byte目からになる、という認識でよろしいでしょうか。 そうなりますとおっしゃる通りファイルヘッダのオフセット位置までしか定数化できませんね。 あとはコード上でオフセットの値分位置をずらす、と。 >WinAPIの構造体をそのまま利用できないのであれば、「同等の構造体」を定義するのも一つの手です。 画像形式のヘッダごとに構造体を作成するということですよね。 ただそこまで知識を身に付けることが出来ていればbmpに関してはWinAPIの構造体を利用し、jpegなどは自作した構造体という形になると思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
「フォーマットがど~の」とかいう前に, 「C++ 標準ライブラリのみ」で画像を表示することは不可能だと思う. 「標準ライブラリ」がどういう意味であるかにもよるけど....
お礼
ありがとうございます。 >「標準ライブラリ」がどういう意味であるかにもよるけど.... 私の認識ではMFCやCLIを使用しないもの、としております。 定義に関して曖昧な部分が多いことは否定できません。 http://docs.sun.com/app/docs/doc/820-1213/6nctanure?l=ja&a=view あと補足になるかもしれませんが「OS:Windows」としている以上WindowsのAPIは使用します。
- SilverThaw
- ベストアンサー率32% (260/806)
>どこに何が入っているのかがわかりません。 ビットマップのデータ構造は理解できていますか? Microsoft Windows Bitmap Image http://ja.wikipedia.org/wiki/Windows_bitmap
お礼
回答ありがとうございます。 >ビットマップのデータ構造 サイトを参照したところ、理解できておりませんでした。 てっきりBITMAPFILEHEADER等は単なるWindowsAPIの構造体かと。 0バイト目から BITMAPFILEHEADER構造体 14バイト目から BITMAPV5HEADER構造体:98以降の場合 nバイト目から RGBQUAD構造体 n + 4 バイト目から ボトムダウン形式の画像データ データ構造に関しては以上の認識で宜しいでしょうか。 また、圧縮形式という項目が存在します。 ご紹介いただいたデータ構造というのはビットマップ専用のものではないのでしょうか?(jpeg、png等もこれと同じデータ構造で出来ている?)
お礼
ありがとうございます。 >こういったデータのデータ構造可変の為、「ヘッダのサイズ」や「次のデータのオフセット位置」等で表す場合が多いですから。 例えばファイルサイズが欲しいときは「先頭から6バイト目を参照する」ということになりますよね。 const int FILE_SIZE = 6; このように定数定義しようと考えていたのですが、それでは問題ありますでしょうか。 次のデータのオフセット位置、であれば const int FILE_TYPE = 2; const int FILE_SIZE = 4; //ファイルサイズの位置 Index = FILE_TYPE + FILE_SIZE; となりますがこれでは全データ分を定数定義しなければならないので。 >これは他のデータのファイルを「バイナリエディタ」で除いた方がはっきりとわかりますよ。 jpegは先頭から .リ....JFIF~ といった感じでまったくの別物でした、確かに何の関連性もないようですね。 >おそらく、「圧縮形式」のところが引っかかっているのでしょう。 その通りです。 jpeg等は別個に形式を持っているにも拘らずbitmap形式にjpegの圧縮形式情報を持たせる意義がわからず?となっておりました。 BITMAPV5HEADER等の圧縮形式に関してわからなければまた別個に質問させていただきます。