プロが教えるわが家の防犯対策術!

C++ WindowsAPI でプログラミングしています。

以下の場合においてビットマップハンドルを構成し、BitBltなどで貼り付ける楽な方法が知りたいです。

ファイル内にビットマップ形式の画像ファイルのバイナリデータが丸ごと埋め込まれている、
ファイル画像ファイルデータの前後に何らかのデータが置かれる、かつ、画像ファイルバイナリの
開始位置と終了位置を知ることができる。

自分が調べた限りでは、バイナリを読んでビットマップファイルの各構造体に書き込んで、
CreateDIBitmap を使うのがもっともよさそうなのですが、もっと楽な方法がないものでしょうか?

A 回答 (3件)

WindowsAPIだと


実行可能ファイルであればリソースとして拾えば可能と思いますが

それ以外の任意の形式中のビットマップファイルのバイナリについて
>バイナリを読んでビットマップファイルの各構造体に書き込んで

を行わないなると
一端テンポラリなファイルに書き出してからLoadImageなどで読み込むくらいに絞られるはずです。

とはいえ、そうするためにかかるコストがわずかで済むと判明している場合に限っては、その手もありかもしれません。

ただ、そこでパフォーマンスが必要な場合
それらファイル操作関連に強いクラスが現状手元にない場合は
面倒さでいえばどっちもどっちな気がします。


一度作ってしまってカプセル化すれば、バグフィックス以外ではそれ以降いじる必要がないような部分ですから

>バイナリを読んでビットマップファイルの各構造体に書き込んで、CreateDIBitmap を使う

でもよろしいかと思います。

というより、それが一番素直で、かつ無駄なコストがないかなと
(過去にJPEGとかの圧縮形式をバイナリいじろうとしたら大変面倒でしたがw BMPならチョロっとでいいですからね。)


DirectXなんかだと
D3DXCreateTextureFromFileInMemoryとか使えば、メモリやメモリマップドファイルからポインタで一発なんですけどね。(DirectXの初期化は、大抵超メンドイですが)


なお

>BitBltなどで貼り付ける

のが主目的で、かつメモリへのポインタアクセスで内容を書き変えたいのであれば
環境次第でCreateDIBitmapよりCreateDIBSectionの方が、パフォーマンスや扱いやすさの点で勝る場合があります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます、やっぱCreateDIBitmapかなあと思われるので、がんばって組んでみます。

お礼日時:2012/02/02 05:27

おっと、時間かけて以前のソース確認しながら書いてたら、unacyoさんの内容と一部かぶってしまいましたw


そこんとこ失礼いたしました。
    • good
    • 0
この回答へのお礼

両者の考えの共通部分ということで、参考になります。

お礼日時:2012/02/15 21:52

ファイルの中にあるビットマップに、BITMAPFILEHEADERも入っているのであれば、ヘッダー(FILEとINFO)+画像データを一度HDDにファイルとして保存し、LoadImage()したら、ビットマップハンドルが貰えますから、これとCreateCompatibleDC()で作ったDCをSelectObject()で結び付けて、Bitblt()、が楽かな?


たぶん、LoadImage()はDIBで作らないと、真っ黒画像が転送されちゃいますので、指定を忘れずに。
    • good
    • 0
この回答へのお礼

回答ありがとうございます、プログラム面では、一時ファイルを作るのが一番楽なんですかね・・・。

お礼日時:2012/02/01 17:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!