• ベストアンサー

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

趣味で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); ↑ここでつっかかります。おかしいところがありましたら回答をお願いします。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答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
質問者

お礼

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

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答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

  • C言語で画像処理

    C言語で画像処理をしたいのですが、元となる画像の形式は何がよいのでしょうか?BMP,GIF,JPEG,PNG,などいろいろな形式がありますよね。一般的には画像処理プログラミングをするときに、どの形式の画像を用いるのでしょうか? また、その画像の読み込み方がわかりません。C言語は入門書を一通りやってみた程度で、画像処理のプログラミングの仕方がわかりません。 初心者なものでよろしくお願いします。

  • c言語の画像処理プログラム

    画像処理を勉強している初心者です。これからいろいろな画像処理を勉強していく予定ですが、もっとも基本のc言語で画像を表示させる方法がわからないですが、プログラムのソースとやり方を詳しく教えていただけませんか?

  • おすすめのプログラム言語は?

    私は MS-DOS の頃に少々プログラムをかじった程度で、GUI のプログラムは全くの初心者です。また日曜プログラマーとして再開したいと思っています。こんな私に、何かおすすめの「プログラム言語」をアドバイスいただけないでしょうか?個人的な「好み」でも構いません。(^^) さて、私の理想ですが・・・(あくまで理想です。よくわかっていないもので。)  ・GUI。  ・初心者でもワンタッチで簡単インストール。  ・たった1個のかわいい実行ファイル。  ・BMP、TIFF、JPEG などの画像形式を、簡単に読み書きできる。  ・ルートや三角関数なども簡単に使える。  ・サーバーではなく、ユーザーのパソコンで動く。  ・できれば Windows でも Mac でも使える。  ・Web ブラウザー上で動いてくれてもうれしい。  ・マニュアルなどの情報が充実している。  ・シンプルで美しく直感的な言語。  ・習得しやすい言語。  ・なんだかかわいい言語。  ・長続きしそうな言語。  ・安いに越したことはないですが、有料でも OK です。  ・ソースはシンプルに。コンパイラーががんばる。 今「JAVAアプレット」というのに興味を持っているのですが、とあるサンプルを実行しようとしたら、実行環境のようなもののインストールを促され、続いてウィルス対策ソフトが警告を出し、再起動し、しかも動きませんでした。(笑)初心者の私からすると、すこし怖い印象が残りました。 Windows パソコンしか持っていませんが、Mac をメインにしてもいいと思っています。よく知らないのですが、Mac のデザインに憧れていまして。。。見た目だけで悩殺されています。(すみません) しばらくは画像の加工ツールなど作っていく予定です。試してみたいアルゴリズムがありまして。。 むちゃくちゃな質問かも知れませんが、どうかよろしくお願いいたします。

  • 画像処理

    IrfanViewという画像表示ソフトを使ってVisual cでc言語画像処理のプログラムを実行して処理した画像を表示させたいです。プログラムのソースともとの画像があるのですが、どのようにすれば、もとの画像がどこにあれば処理できるかわからないです。詳しく教えていただけませんか?osはwindows xpです。

  • JPEG画像表示プログラムについて

    こんにちわ。お時間ありましたらご教授お願いします。 JPEG画像を表示させることができるプログラム(C言語)を作成したいのですが、うまくいかず困っています。私はJAVAを少し触った程度なので知識がなく困っております。 添付させていただいたプログラムはbmp画像を表示させることはできるのですが、JPEGライブラリを使ってJPEG画像を表示できるプログラムを作りたいと思っております。 説明不足でわかりにくいですが、ご教授お願いします。 開発環境はCです。よろしくお願いします。

  • C言語での画像処理:jpeg→pgmへ

    Linux(Fedora core 4)を使っております。 今回C言語で画像処理を行いたいと考え、画像の形式がpgm形式としてのプログラムを組みました。 このプログラムを、実際にデジカメでとった写真について使いたいのですが、デジカメで撮った写真はjpeg形式の為、これをpgm形式に変換したいのですが、これはプログラムを作って行うことはできるのでしょうか。もしくはツールが必要なのでしょうか。ちなみに当方プログラミング初心者でございます。 よろしくお願い致します。

  • 入力した画像に最も近い画像を持ってくるプログラムについて。

    入力した画像に最も近い画像を持ってくるプログラムについて。 入力した画像に最も近い画像を持って来るプログラムを開発して、その速度の改善を行うといったことを行いたいのですが、画像処理方面に関して初心者で、やり方がよくわかりません。どなたか、画像の比較プログラムが紹介されているサイトや、サンプルプログラムがあるページをしってるかたがいましたら是非教えてくださいますようお願いします。 言語はC,C++,C#などでお願い致します。

  • JPEGとBMP

    JPEGで保存してある画像をBMP形式に変換する事というのは可能なのでしょうか? また、JPEG形式の画像を2値化するプログラムをC言語で書くことは可能なのでしょうか? JPEGとBMPの違いがよく分からないので、そのあたりも教えていただけるとありがたいです。 よろしくお願いします。

  • プログラムについて

    プログラムの事は一切わからないのですが、よくプログラマーは大変だから趣味の範囲で楽しんだほうがいいとか聞きます。その趣味の範囲で一体みなさんは何をしているでしょうか? 自分もプログラムには興味はあるので教えて下さい。またどの言語が扱いやすくメジャーなのでしょうか?

  • 画像の保存について

    bmpという形式の画像(イラスト)を ヤフーオークションにアップするために pict bearでjpeg形式で保存し直すと 画像の質がすごく落ちてしまいます 画像の質をなるべく落とさずに bmpの画像をjpegに変える方法はありませんか? パソコン初心者なのでわかりやすく説明していただけると ありがたいです

専門家に質問してみよう