• ベストアンサー

画像処理プログラムについて

趣味でC言語を勉強しており、画像転送のプログラムに興味があり、やっているのですが、どうもエラーがよくわかりません。 BMP形式での通信をやっています。 readBmp: Open error! 実行すると、 というのが表示されます。 まだ初心者なので、わかりません。返答をお願いします。

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

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

 こんにちは。 >>ReadFile(hFile, sBuf, 10000, &dwActBytes, NULL);  取り敢えず、プログラムを拝見する限り、此れはファイルから読みたいのではなくて、sBufに落として来たデータをビットマップのデータに直接変換したい様に見えます。  其れをどのようにして取り扱いたいのでしょうか。HBITMAP型へ変換してしまうのが、手っ取り早くて楽です・・・。  以下URLの3番の回答にある  http://oshiete1.goo.ne.jp/qa4364441.html  static HBITMAP ReadDIB(const BYTE* pFileBuf)  をコピーして、 +-----------------------------------------------------------------------------------------  hFile = CreateFile(filename, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  printf("FTPサーバ上でファイルの読み書きのために開いた\n"); //実行時に表示  f_size = GetFileSize(hFile, &f_size_high); //もらった画像をバイトに変換  send(remoteSocket, (char *)&f_size, sizeof(DWORD), 0);  ReadFile(hFile, sBuf, 10000, &dwActBytes, NULL);  printf("バイトに変換\n");  //printf("入力画像ファイル名(*.bmp):"); scanf("%s", input);  //以下は恐らく24ビット以外では落ちる。更にファイルから読むので意味が無い  //×readBMP(input,image_in);  //ココでsBufをビットマップハンドルに変換(以後、win32apiを使用して操作する)  HBITMAP hBitmap = ReadDIB(sBuf);  //例えば画素にアクセスしたければ・・・  BITMAP bmpData = {0};  ::GetObject(hBitmap, sizeof(bmpData), &bmpData);  HDC hDC = ::CreateCompatibleDC(NULL);  for(int y = 0; y < bmpData.bmHeight; ++y)  {    for(int x = 0; x < bmpData.bmWidth; ++x)    {      const COLORREF c = ::GetPixel(hDC, x, y);      const BYTE r = GetRValue(c);      const BYTE g = GetGValue(c);      const BYTE b = GetBValue(c);    }  }  ::DeleteDC(hDC); ------------------------------------------------------------------------------------------+  ・・・と言った具合では駄目なのですか?

12171988
質問者

お礼

ありがとうございます。やってみます。お忙しいのにありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (6)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

私の補足要求は答えて貰えないんでしょうか? 基礎をおろそかにしすぎです。書かれているプログラムを見るとそれが現れてます。本当に理解したかったら回り道に見えても一つ一つ積み重ねないと先に進めませんよ。 ヒントを一つだけ、printf("%s\n", input);って何が表示されます?

12171988
質問者

お礼

ありがとうございます。考えてみます。

すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

残念ながら示されたプログラムには問題がありません。 みなさんが言っているファイル名が違うよって話を理解してください。 まず、fopenがどういう事をする関数で==NULLって条件を満たすと「readBmp: Open error!」が表示されるのはなぜかを理解することです。 参考書の丸写しでもよいので書いてみてください。 ・fopenとは? ・fopen()==NULLの条件の意味。

12171988
質問者

お礼

お忙しい中申し訳ございません。 ありがとうございました。

12171988
質問者

補足

hFile = CreateFile(filename, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); printf("FTPサーバ上でファイルの読み書きのために開いた\n"); //実行時に表示 f_size = GetFileSize(hFile, &f_size_high); //もらった画像をバイトに変換 send(remoteSocket, (char *)&f_size, sizeof(DWORD), 0); ReadFile(hFile, sBuf, 10000, &dwActBytes, NULL); printf("バイトに変換\n"); //printf("入力画像ファイル名(*.bmp):"); scanf("%s", input); readBMP(input,image_in); ↑ここでつっかかります。おかしいところがありましたら回答をお願いします。

すると、全ての回答が全文表示されます。
回答No.4

とゆ~かさ http://www.fit.ac.jp/elec/7_online/lu/sample/bmp_image_proc.cpp に「お問い合わせは著者まで。」って書いてあるんだから、ここに聞くのが一番なのでは? それと、このプログラム、スキャンラインのバイト数を見てないから、横のピクセル数が4の倍数になってないbmp画像(スキャンラインのバイト数と、横のピクセル数の3倍が等しくない、パディングが入っている画像)を読み書きしたら、正しく動かない。 横のピクセル数が4の倍数になってない場合、1ラインのデータの末尾に、パディングが入っている画像と、パディングが入って無い画像が存在する。 ファイル中にR、G、Bのデータが1バイトづつ並んでると仮定した場合、 RGBR GBRG BRGB RGBR GBRG BXXX RGBR GBRG BRGB RGBR GBRG BXXX RGBR GBRG BRGB RGBR GBRG BXXX RGBR GBRG BRGB RGBR GBRG BXXX (XXXは、1ラインを「4の倍数バイト」にする為のパディング) になっているBMPファイルと RGBR GBRG BRGB RGBR GBRG B RGBR GBRG BRGB RGBR GBRG B RGBR GBRG BRGB RGBR GBRG B RGBR GBRG BRGB RGBR GBRG B になっているBMPファイルが存在する。 こ~ゆ~2種類のファイルが存在するのは「当初、MSが仕様をはっきりさせてなかったので、パディング有りとパディング無しと、両方の仕様のbmpファイルが世の中に広まっちゃった」から。全部MSが悪い。 他にも、bfOffBitsの値を見ず、ヘッダの直後にデータが続いてると思い込んでるし、24ビットカラーだと思い込んでるし、このプログラム、ハッキリ言って「初心者が利用するには、問題が多過ぎ」ですな。

12171988
質問者

お礼

回答ありがとうございました。そのアドレスを見てみます。

12171988
質問者

補足

void readBMP( char *filename, // BMPファイル名 unsigned char image[Y_SIZE][X_SIZE][3] // 24ビットRGB画像配列 ) { FILE *fp; int i, j, k; // ファイルオープン if ((fp = fopen(filename, "r"))==NULL) { printf("readBmp: Open error!\n"); exit(1); } ここでひかかっているのでは、と思うのですが、返答をお願いします。

すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

ちゃんとした参考書を買われて勉強された方が良いと思いますよ。 Open errorが何か分らない時点で基本知識がかなり不足しているのを感じます。「転送」や「通信」と言う用語も使い方を間違っている気がします。

12171988
質問者

お礼

参考書をよく読んでやってみます。

すると、全ての回答が全文表示されます。
回答No.2

以下、初心者が良くやるミス。 readBmp("C:\temp\newimage.bmp",ImageBuffer); Cで「\t」や「\n」が何を意味するか、良く考えよう。 良く考えて、それでも判らなかったら、以下の文を良く見て「\\」が何を意味するか、良く考えよう。 readBmp("C:\\temp\\newimage.bmp",ImageBuffer);

12171988
質問者

お礼

この方法を使ってみたいと思います。ありがとうございました

すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

プログラムの内容がわかりませんのでエラー文からの推測になりますが readBmpよりBMPを読み込む処理だと考えられます。 Open errorからはファイルのオープンに失敗した可能性が考えられます。 結論としてビットマップファイルの読み込みに失敗したと思われます。 対処としてはファイル名やファイルの場所を確認するのがいいかもしれません

12171988
質問者

お礼

ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A