• ベストアンサー

ファイルに埋め込まれた画像を*楽に*読む方法

C++ WindowsAPI でプログラミングしています。 以下の場合においてビットマップハンドルを構成し、BitBltなどで貼り付ける楽な方法が知りたいです。 ファイル内にビットマップ形式の画像ファイルのバイナリデータが丸ごと埋め込まれている、 ファイル画像ファイルデータの前後に何らかのデータが置かれる、かつ、画像ファイルバイナリの 開始位置と終了位置を知ることができる。 自分が調べた限りでは、バイナリを読んでビットマップファイルの各構造体に書き込んで、 CreateDIBitmap を使うのがもっともよさそうなのですが、もっと楽な方法がないものでしょうか?

  • sub_6
  • お礼率100% (7/7)

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

  • ベストアンサー
回答No.2

WindowsAPIだと 実行可能ファイルであればリソースとして拾えば可能と思いますが それ以外の任意の形式中のビットマップファイルのバイナリについて >バイナリを読んでビットマップファイルの各構造体に書き込んで を行わないなると 一端テンポラリなファイルに書き出してからLoadImageなどで読み込むくらいに絞られるはずです。 とはいえ、そうするためにかかるコストがわずかで済むと判明している場合に限っては、その手もありかもしれません。 ただ、そこでパフォーマンスが必要な場合 それらファイル操作関連に強いクラスが現状手元にない場合は 面倒さでいえばどっちもどっちな気がします。 一度作ってしまってカプセル化すれば、バグフィックス以外ではそれ以降いじる必要がないような部分ですから >バイナリを読んでビットマップファイルの各構造体に書き込んで、CreateDIBitmap を使う でもよろしいかと思います。 というより、それが一番素直で、かつ無駄なコストがないかなと (過去にJPEGとかの圧縮形式をバイナリいじろうとしたら大変面倒でしたがw BMPならチョロっとでいいですからね。) DirectXなんかだと D3DXCreateTextureFromFileInMemoryとか使えば、メモリやメモリマップドファイルからポインタで一発なんですけどね。(DirectXの初期化は、大抵超メンドイですが) なお >BitBltなどで貼り付ける のが主目的で、かつメモリへのポインタアクセスで内容を書き変えたいのであれば 環境次第でCreateDIBitmapよりCreateDIBSectionの方が、パフォーマンスや扱いやすさの点で勝る場合があります。

sub_6
質問者

お礼

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

その他の回答 (2)

回答No.3

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

sub_6
質問者

お礼

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

  • unacyo
  • ベストアンサー率51% (35/68)
回答No.1

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

sub_6
質問者

お礼

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

関連するQ&A

  • ビットマップの画像処理について自由度を得る最適方法

    以下、長文かつ具体性に欠ける質問で済みません。画像処理についてやりたいことは決まっているのですが、やり方がわからなくて長年困っています。 【やりたいこと】:ビットマップ形式による写真画像があります。その画像上に例えば、何らかのデータに基づいて線を引いたり、写真画像を数値化して計測したり、自由に加工したりするものです。そのためにはビットマップファイルを自由に操作出来なければなりません。 【これまでにやったこと】 ○Windows VC++ 6.0, Borland C++, Visual Basicなどの勉強 WindowsAPIなど。 ○既成ソフトでの操作(Adobe系,ImageMagik,など) ○科学技術系ソフト(Matlab, Octaveなど) どれも何となくイメージと違うのです。画像ファイルというのはバイナリで、ヘッダ部とデータがあり、(500×500)などの2次元ラスターファイルに過ぎないと私は考えています(色もあるのでさらにそれが何枚かあるのかも知れませんが、基本構造は同じ?)。WindowsAPIなど勉強していると難しいクラスの説明ばかりですが、もっと簡単に処理できるだろうと思っています。画像処理ソフトでは、感覚に頼って見た目に応じてマウスで処理するので正確ではありません。どうしても数値のデータとして処理したいのです。 テキストとして取り出されたビットマップファイル(500×500)の処理はループを回してアレコレ処理すればよい(自由度無限大、だからいろいろあって難しいが)わけですね。要するにビットマップファイルを数値データとして自由に読み書きできるスキルを最も最速で習得するにはどうしたらよいかということなのです。 前提となる画像フォーマットはWindows Bitmapです。そうでないものはペイントショップなどで(質はともかく)変換できるので、その問題はクリアしています。 やはり、WindowsAPIの勉強が不可欠なのでしょうか。 プログラムのスキルとしてはFortranによる科学技術計算プログラムを10年以上作成しています。Fortran95ぐらいだったらポインタなどもあるようなのでビットマップのエディットはひょっとしたら簡単なのかも知れませんが。 以上、長文で失礼します。よろしくお願いします。

  • 画像ファイルの編集の方法

    画像にはいろんなフォーマットがありますが、ソフトウェアを使うとフォーマット変換ができます。そこで例えばビットマップに変換できたとします(変換には不可逆とか不可逆の圧縮とかありますが、そこはとりあえず不問で)。 そこでプログラムによってビットマップを何らかの方法で数値として取り出し、編集してまた元に戻すことを考えています。これが自在にできると大きな自由度を得ることができます。ビットマップですから平面に展開された数値(RGB値?)だと思います。編集作業が一番難しいのでしょうが、プログラムを駆使して何かができてそれを元に戻すと編集後の画像が再構成されます。このようなことを実行する方法はC++とかJAVAなのかなと思うのですが、実際どのようにして行うことが可能でしょうか。そのようなテンプレートのようなプログラムがあると助かるのですが。画像ファイルのヘッダーなどは形式によって決まっているのではないかと思いますが。なお、できるのであれば形式はビットマップでなくてもいいです。よろしくお願いします。

  • GTOPO30のDEMファイルのデータ構造

    GTOPO30のデータを取り込むプログラムを書きたいのですが、DEMファイルをバイナリエディタで開いても訳が分かりません。どういうデータ構造になっているのでしょうか?プログラミング初心者です。よろしくお願いします。

    • 締切済み
    • PHP
  •  BitBltでの表示での問題です。

    WindowsAPIでの描画系の質問です。 WindowsAPIで、bitmapファイルを描画するAPI、BitBltがあるのですが、 画像を読み込み、これを表示させると透過処理がないことがわかります。 そこでBitBltで、マスク処理した画像を用意し、表示させることで表示させたくない部分を 透明にさせることができるみたいですが、どうしてそういったことが可能なのでしょうか? bitmapファイルの黒い部分と別のbitmapファイルの白い部分を重ねることでできるのですが なぜ白と黒とで透明になるのか分かりません。 どうしてでしょうか? 以上です。 よろしくお願いします。

  • 画像を登録したい!

    MySQLサーバに画像を登録したいのですが、webで調べましたところ・・・ ○画像ファイルはあるフォルダにいれておいてデータベースにはその画像ファイル名を登録する方法 ○画像ファイルのバイナリデータをデータベースに登録する方法 があることはなんとなくわかったのですが、それを具体的にどうコーディングしたらいいか(特に2つ目の○)が調べてみてもよくわかりません。 Exif情報も画像から読み込んでデータベースに登録したいので2つめの方法がよいのかなどもいろいろ考えましたがわからなくて困ってます。 どうかご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • PDFファイルの内容を画像として保存する方法

    恐れ入りますが、 PDFファイルの内容の一部をビットマップ形式で保存する 方法について教えていただけませんでしょうか? 以下の方法では上手くいきませんでしたので: 1.PDF文書の一部をスナップショットで選択→クリップボードに保存される 2.クリップボードに保存されたものを、ビットマップ形式でWordファイルに貼り付ける。 3.Wordファイルに貼り付けられたそのビットマップ画像をコピーし、任意のフォルダの中で「貼り付け」る。 4.結果:そのフォルダ内に、ビットマップファイルではなく、「スクラップ」ファイルが貼り付けられる。 ビットマップファイルだけを抽出したいのですが・・・。 その方法をご存知の方がいらっしゃいましたら、どうかご教示くださいませ。

  • 画像ファイルを読み込んでコピーする方法

    画像ファイル(gif,jpg)などを読み込んで、読み込んだファイルを指定のフォルダにほり込みたいのですが、方法が思いつきません。ライブラリを使えば簡単にできるのですが、原理というか一連の流れを知りたいので、良い方法を知ってるかた、誰かおしえてくれませんか? 標準入力をつかってバイナリーで読み込めばいいというのはチラッときいたのですが、イマイチわからなくて・・・。

    • ベストアンサー
    • Perl
  • バイナリーとして.wavファイルに書き込む方法は?

    バイナリーで書き込み拡張子.wavのファイルにしたいと考えています。 なお、.wavファイルのデータ構造は分かっています。 この場合、fwriteでバイナリーファイルとして書き込み、 拡張子を.wavにすればよいのでしょうか? それとも、.wavファイルとして書き込むためになんらかの処理が必要なのでしょうか? (おそらく拡張子を変えるだけだと、.txtファイルになると思いますので。)

  • ビットマップの画像ファイルの型式を調べるには?

    ビットマップの画像ファイルがありまして、 そのビットマップが256色なのか、24ビットなのか、モノクロ(白黒)形式なのかなど、 正確に調べる良い方法ってございませんでしょうか? どうぞ、ご教授よろしくお願いしますm(_ _)m

  • imgctl.dllを使って読み込んだ画像ファイルをTransparentBltで画く方法

    今、LoadImage()で読み込んだBMP画像を BitBlt(hdc,x,y,dx,dy, hMin,0,0,SRCCOPY));や TransparentBlt(hdc,x,y,dx,dy, hMin,0,0,dx,dy,RGB(r,g,b)); で画面に書くCプログラムがあります。このプログラムをBMP画像だけでなくPNG画像も扱えるように拡張しています。いろいろと調べた結果PNG画像を読み込むためにライブラリimgctl.dllを使うプログラムに変更している途中です。しかし、imgctl.dllではLoadImage()の代わりにToDIB()関数で読み込むため、JPEG画像もPNG画像も読めるのですが、独自のDIBデータハンドル(HDIB)で管理するためHDC(デバイスコンテクストハンドル)が取得できません。そのため、 問題1、画面書き出しはBitBlt()が使えない。 問題2、TransparentBlt()関数が使えない。 という問題があります。 問題1は、DIBtoDC()で代用することで、解決しましたが、問題2が未解決です。 お知恵をお貸しください。 たとえば、HDIBからHDCを得る方法、あるいは、特定の色RGB(r,g,b)を透明として扱うTransparentBlt()関数に代わるHDIBを使った関数をお教えいただければうれしいです。

専門家に質問してみよう