- ベストアンサー
ファイルに埋め込まれた画像を*楽に*読む方法
C++ WindowsAPI でプログラミングしています。 以下の場合においてビットマップハンドルを構成し、BitBltなどで貼り付ける楽な方法が知りたいです。 ファイル内にビットマップ形式の画像ファイルのバイナリデータが丸ごと埋め込まれている、 ファイル画像ファイルデータの前後に何らかのデータが置かれる、かつ、画像ファイルバイナリの 開始位置と終了位置を知ることができる。 自分が調べた限りでは、バイナリを読んでビットマップファイルの各構造体に書き込んで、 CreateDIBitmap を使うのがもっともよさそうなのですが、もっと楽な方法がないものでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
WindowsAPIだと 実行可能ファイルであればリソースとして拾えば可能と思いますが それ以外の任意の形式中のビットマップファイルのバイナリについて >バイナリを読んでビットマップファイルの各構造体に書き込んで を行わないなると 一端テンポラリなファイルに書き出してからLoadImageなどで読み込むくらいに絞られるはずです。 とはいえ、そうするためにかかるコストがわずかで済むと判明している場合に限っては、その手もありかもしれません。 ただ、そこでパフォーマンスが必要な場合 それらファイル操作関連に強いクラスが現状手元にない場合は 面倒さでいえばどっちもどっちな気がします。 一度作ってしまってカプセル化すれば、バグフィックス以外ではそれ以降いじる必要がないような部分ですから >バイナリを読んでビットマップファイルの各構造体に書き込んで、CreateDIBitmap を使う でもよろしいかと思います。 というより、それが一番素直で、かつ無駄なコストがないかなと (過去にJPEGとかの圧縮形式をバイナリいじろうとしたら大変面倒でしたがw BMPならチョロっとでいいですからね。) DirectXなんかだと D3DXCreateTextureFromFileInMemoryとか使えば、メモリやメモリマップドファイルからポインタで一発なんですけどね。(DirectXの初期化は、大抵超メンドイですが) なお >BitBltなどで貼り付ける のが主目的で、かつメモリへのポインタアクセスで内容を書き変えたいのであれば 環境次第でCreateDIBitmapよりCreateDIBSectionの方が、パフォーマンスや扱いやすさの点で勝る場合があります。
その他の回答 (2)
- LongSecret
- ベストアンサー率68% (22/32)
おっと、時間かけて以前のソース確認しながら書いてたら、unacyoさんの内容と一部かぶってしまいましたw そこんとこ失礼いたしました。
お礼
両者の考えの共通部分ということで、参考になります。
- unacyo
- ベストアンサー率51% (35/68)
ファイルの中にあるビットマップに、BITMAPFILEHEADERも入っているのであれば、ヘッダー(FILEとINFO)+画像データを一度HDDにファイルとして保存し、LoadImage()したら、ビットマップハンドルが貰えますから、これとCreateCompatibleDC()で作ったDCをSelectObject()で結び付けて、Bitblt()、が楽かな? たぶん、LoadImage()はDIBで作らないと、真っ黒画像が転送されちゃいますので、指定を忘れずに。
お礼
回答ありがとうございます、プログラム面では、一時ファイルを作るのが一番楽なんですかね・・・。
お礼
回答ありがとうございます、やっぱCreateDIBitmapかなあと思われるので、がんばって組んでみます。