• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VisualC++でどんな風にすれば画像処理が?)

VisualC++で画像処理をする方法

このQ&Aのポイント
  • VisualC++で画像処理をする方法について教えてください。
  • BMP画像のデータの総量を取得して、その量によってショートカットを起動する方法がわかりません。
  • BMP画像の構造や開いた後の変数への入れ方が理解できず、困っています。fopenで開いた後は配列に入れるなどの方法を試しましたがうまくいきません。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

まずは、基礎を勉強してから。 「どっちも動かなかったんですけど」とありますが、具体的に、どんな動作をしたのですか?エラーになったのなら、どんなエラーメッセージが出ているのですか? プログラムを修正するときは、どこが原因でどう「動かない」かを確認することが大事です。 2つ目のプログラムは、ファイル指定さえ間違えなければ、問題無く動作するはずです。 一般の範囲では、致命的な間違いはありません。 (intの最大値を越えると問題ですが、そんなBMPはまずありません) 絶対パスを書くときは、\の扱いに注意しましょう。 1つめのプログラムは、見ただけでわかるの問題点があります。 ・失敗しているのは、fopenなのか、それ以外なのか?それを調べましょう。 fopenは失敗の多い関数です。成功したかどうかを確認するのが普通です。 1例として、fopenのあとに次のコードを入れるなどします。これは、エラーメッセージを出力して終了します。 if( fpr == NULL ) { perror(NULL); return 1; } /* 2つ目のプログラムには同様の処理が入っているんですが。 */ perrorについては、マニュアルを。 http://msdn.microsoft.com/ja-jp/library/9t0e6085%28v=vs.71%29.aspx 既に指摘があるように、ファイルがカレントディレクトリにあるか?ファイル名が間違っていないか等を確認してください。 ・fopenのモードに注意しましょう。 Windowsの場合、バイナリモードとテキストモードで動作に違いがあります。 BMPのようなバイナリファイルを読むときに、テキストモードを使うと正常に読み込むことができません。 ・fscanfはテキストファイルから読み込んだ文字列を、書式に従って変換して変数などに取り込むものです。 バイナリファイルであるBMPから、%ldで「数字の並んだ文字列」を読み込むなど、まずありえません。 また、 fscanf(fpr,"%ld","bfSize",&bitsize); の場合、 %ldに対応しているのは、第3引数である"bfSize"です。 このように記述された文字列リテラル(文字列の定数)は、const char *型のポインタとして処理されます。 仮に、%ldで数値が読み込めたとしても、その読み込み先は、"bfSize"の文字列が格納されているメモリ空間であり、変数bufsizeではありません。 おそらく、保護されている領域への書き込みになり、エラーで止まるでしょう。

その他の回答 (3)

  • okgoripon
  • ベストアンサー率44% (1141/2548)
回答No.3

「わからない」ばかりで、とてもプログラミングができるレベルには見えないのですが……。 あなたの場合、基礎が全く出来ていませんので、まずはプログラミングの入門からやり直すべきです。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>出来ればfopenのやり方を教えていただければあとは比較する文ぐらいなら自分で考えられそうなんですが(~~<~~とか) >ヒントを教えてください。(ヒント言われても自分理解できるのかな・・・) なら、とりあえず確認すべき点として1つ。 >fpr=fopen("テスト.bmp","r"); >char *fname = "test.bmp"; >fp = fopen( fname, "rb" ); 相対パス指定のようなので「カレントディレクトリにそのファイルが存在」しますか? # 絶対パスではないですから相対パス…ですわな。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

以前使ったソースを わざと切り貼りしたサンプル エラー処理は削ってますし切り貼りなのでそのままではエラーになるかもしれませんが 必要な基本的情報は網羅してるはずです 資料読んで理解できない人がここで回答して理解できるのかという根本疑問があるので あとは自分で調べてください BITMAPFILEHEADER bmpfh; CFile file; LPBITMAPINFO lpbmi; // BITMAPINFO 構造体 へのポインタ int nHeaderSize; // BMPヘッダサイズ nHeaderSize = sizeof(BITMAPFILEHEADER); // ファイルを開く file.Open("ファイル名", CFile::modeRead | CFile::typeBinary | File::shareDenyNone) //BMPファイル(ヘッダ)情報を読む file.Read((void *) &bmpfh, nHeaderSize) // データ読み込みのために、グローバルメモリを割り当てる BYTE *m_pDIB m_pDIB = (BYTE *) new char[file.GetLength() - nHeaderSize]; // バッファに画像情報+色データを読み込む file.ReadHuge(m_pDIB, file.GetLength() - nHeaderSize); file.Close(); lpbmi = (LPBITMAPINFO)m_pDIB; //画像情報へのアクセス例 lpbmi->bmiHeader.biWidth  //画像 横サイズ lpbmi->bmiHeader.biHeight; //画像 縦サイズ //メモリ開放 delete m_pDIB

yuki-yuto
質問者

補足

ふむふむ・・・何となく理解できて来ました。 この処理に必要なヘッダーはやっぱりbmp.hでしょうか?