• 締切済み

モノクロビットマップファイルを読み込んでビット配列に格納

【環境】WindowsXP、VC++2005、MFC タイトルの通りなんですが、モノクロビットマップから画像データ部のビット配列を取得したいと思っております。 目的は、各ビットのON/OFFを判定したいからです。 どんな方法で取得すれば良いのかアドバイスをお願いいたします。 また、参考になるサイト等がございましたら合わせてご教授お願いいたします。

  • ya-cha
  • お礼率68% (184/268)

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

あなたが扱おうとしている「モノクロビットマップ」なるものは, どのようなフォーマットに従っているのですか?

ya-cha
質問者

補足

http://www.kk.iij4u.or.jp/~kondo/bmp/​ このようなフォーマットです。 ちなみにbiHeightは負数にしております。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.1

>目的は、各ビットのON/OFFを判定したいからです。  画像データは、ビットそのままで「ON/OFF」です。 >参考になるサイト等がございましたら併せてご教示お願いいたします。  http://www.kk.iij4u.or.jp/~kondo/bmp/  ヘッダ(構造体)を、実体で検証・確認できれば、あとは楽ちんです。  構造体は、windows.h(wingdi.h) に入っています。  注意点  ・画像データは左下から右上に向かって記録されている。  ・1ラインのデータ長は 4 byte 境界にあわせる必要がある。 ヒント 画像サイズが横 111 の場合、1ラインのデータ長は、( 111 + ( 32 - 1 ) ) / 32 * 32 = 128 と 4 byte 境界にあわせるために「切り上げ」の計算が必要です。 128 - 111 = 17 の末尾部分は、0 で埋まっているかと・・。

ya-cha
質問者

補足

ご回答ありがとうございます。 >ヘッダ(構造体)を、実体で検証・確認できれば、あとは楽ちん >です。 >構造体は、windows.h(wingdi.h) に入っています。 すいません、何の構造体の事なのでしょうか???

関連するQ&A

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

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

  • 【C++】巨大なビット配列の用意の仕方

    現在C++で数値計算用のプログラムを組んでいます。 その計算の中で、2^16個の「on」または「off」のデータをメモリに記憶させる必要があります。その一つ一つにわざわざintやshortなどの既存のデータ型を使うのは馬鹿らしいので、2^16桁の二進数列(=8.2KB程度)を用意して操作したいと思っています。 (もし仮にon=+1,off=0などとしてint型配列を使うと、262KB必要となり、いくつも宣言することがためらわれます。この2^16個のデータを収める「配列」は全部で8000個程度用意したいのです。) これだけ大きなビット配列を、C++で用意するにはどうしたらよいでしょうか? 試しにビットフィールドを用いて struct bit{ unsigned elm :1<<16;  //2^16個のビット数列 }; と宣言してみたのですが、基本型のビット数を超えるからとコンパイルは通りませんでした。@VC++ リソースを活用するためにビット配列を扱った経験のある方など、どうかご教授よろしくお願いします。

  • ビットマップハンドルからビットマップボタンを作りたいです

    MFC初心者です。どうかよろしくお願いいたします。 環境はVC++6.0 MFC ダイアログベースです。 HBITMAP hBitmap; hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), (LPCTSTR)sSaveFile,IMAGE_BITMAP, 0,0,LR_LOADFROMFILE); を使ってビットマップハンドルを取得しました。 ここからボタンに貼り付ける方法がわかりません。 リソースにボタンを作った後、どのようにすれば良いでしょうか? あと、ボタンの好きな位置にビットマップを貼り付ける方法も教えていただけると幸いです。

  • ビットマップボタンを押したときの処理についてなんですが

    環境はVC++6.0 MFC ダイアログベースです。 MFC初心者なんですが、 HBITMAP hBitmap; hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), (LPCTSTR)csBMPFile,      IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); を使いビットマップハンドルをし取得しました。 ビットマップの貼り付けは出来たのですが、ボタンを押したときにビットマップの画像を変える処理の仕方がわかりません>< loadbitmapsなら容易に出来るのですが、どうしてもloadimageを使って表示したいのですが、どのようにすれば良いでしょうか? 御教授よろしくお願いします><

  • ビット演算について

    【環境】WindowsXP(SP2)、VisualC++2005、MFC バイト中の特定のビットの状態を取得したいのですが、 BOOL ret;//戻り値用 BYTE data;//バイトデータ ファイルから1バイトのデータを取得し、例えば 「0011 1011」というデータだった場合、 最初(左端)の1バイトが0の場合に、 定義した戻り値用のBOOL変数にTRUEを代入したいのですが、 ret = 0x80 && ~scanData; のようにしてもうまくいきません・・・。 (かならず1(TRUE)となってしまいます) 手順としては、ビットデータを反転し、判定したいビットと「&」すれば良いと思ったのですが・・・。 1.手順が間違っておりますでしょうか?もし間違っている場合はどのような手順が正しい(一般的)なのでしょうか? 2.手順が間違ってない場合は判定・代入式のどこがおかしいでしょうか? ご教授お願いいたしますm(__)m

  • ビットマップファイルの編集 [VS2005]

    はじめまして。 今回は処理時間の短縮法について御意見御聞きしたくて投稿させて頂きました。 やっていることは、 (1)256色のBitmapファイルをBinaryReaderで読込み格納。 (2)2値化処理を行い、画像データ部を「00」か「01」に変換。 (3)ファイルサイズ圧縮の為8bit→1bitに。 問題としては、下記処理の際に処理時間が大変掛かってしまいます。 状況としては、 画像データ部を書き換える際(8ビットの情報を1ビットへ圧縮)の処理に時間が掛かってしまいます。 現状では、バイト配列:A(0),A(1),A(2),…に格納されている画像データを8ビット分取り出す際は、 dim B(ibyte) as byte dim str as String For i = 1078 To (iDatasize - 1) Step 8 str=A(i)&A(i+1)&A(i+2)&A(i+3)&A(i+4)&A(i+5)&A(i+6)&A(i+7))'画像データ部の8bit分を「str」に格納 B(i) = Convert2to10(str)'2進→10進数へ変換 Next というように、ベタベタと変換/格納してるのですが、画像ファイルのサイズが大きくなると非常に処理が遅いです。 (50MB程度のファイルで60sec程度…) BitConverterを使ってみたりしましたが、なかなか上手い方法が思いつかず。 そもそも見当違いな手順を踏んでいるのか…。 256色のビットマップファイルをモノクロビットマップに変換して(1/8の容量にして)効率よくバイト配列に格納する良い方法があれば指南願います!! 分かり難い文章で大変申し訳ないっす。

  • パスから最後のディレクトリだけを取得したいです

    【環境】WindowsXP、VC++2005(MFC) タイトルの通りなんですが、例えば 「D:\10_test\hoge\sample」というディレクトリのパスから 「sample」だけを取得したいのですが、どうすれば出来ますでしょうか? ご教授お願いいたしますm(__)m

  • 【VC++2005 MFC WindowsXP】バイナリからbit取得

    【VC++2005 MFC WindowsXP】バイナリからbit取得 バイナリファイルの先頭から単純に1bitずつ値を取得し、そのbitが立っているかどうか判定したいと思っております。 私の頭の中では以下のようなイメージでいるのですが、「高速化」「可読性」など、どんな観点でも構いませんので、修正できそうな点をご教授願いますm(__)m (※全面的に修正していただいてももちろん構いません) ・ファイルから1バイト取得する。 ・そのバイトと「(byte & 0x80) ? 0 : 1」を行い、最初のビットがたっているか判定する。 ・次のbitを判定する際には「(byte & 0x40) ? 0 : 1」を行う。 ・このように1byte分(8回)判定を行ったら、次のバイトをファイルから読み込む。 ・これをファイルの最後まで繰り返す。 もっとスマートで高速に処理出来ないか模索しておりますが、何も思いつかず・・・ 参考になるサイトだけでも構いませんのでよろしくお願いいたしますm(__)m

  • 配列の確認

    【環境】Windows XP、C++ サイズがXの配列があります。 配列は0~X-1の数値が1つずつ入れる目的で作っています。 その配列に値の重複が無く、全ての数値が入っているかを確認する処理なのですが、 自分が考えた方法で問題ないのかを確認してもらえないでしょうか? 処理としては、unsigned long long int型をフラグとして使って、(Xが64以上になる予定は今のところないので・・・、けど64に制限されるのが・・・。) 0が入っていたら1ビット目を立てて、1が入っていたら2ビット目を立てて、(以降最後まで続ける)にしようと思っています。 最終的に立っているフラグの数値が、2の(X+1)乗―1とイコールかを判定。 (←計算間違ってるかも) これで問題ないでしょうか? 他にいい案があれば教えてもらえないでしょうか? 以上、よろしくお願いします。

  • ボタン上にビットマップ、アイコンを貼り付ける方法

    VC++でダイアログベースのEXEを作成しています。 以下の方法についてご存知の方がいればご教授願います。 (1) ボタン上にビットマップを貼り付ける方法。 (2) ボタン上のアイコンを貼り付ける方法。 例えばOS標準にあるメモ帳(NOTEPAD.EXE)や、 電卓(calc.exe)にはアイコンがありますが、その絵を ボタン上に貼ることは可能でしょうか。 <環境> OS:WindowsXP VC++6.0

専門家に質問してみよう