バイナリファイルの書き出しについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あすぱら
記事: 12
登録日時: 6年前

バイナリファイルの書き出しについて

#1

投稿記事 by あすぱら » 6年前

あすぱらと申します。
初めての質問で至らぬ点があると思いますが、ご容赦ください。
以下に質問の内容を記載します。

[1] 質問文
 [1.1] 自分が今行いたい事は何か
   unsigned char* imagebufferの先頭アドレスには画像の輝度値が入っています。
   それをfwrite関数とfor文を使用してバイナリファイルに書き出そうとしています。
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
   プログラムが長いので以下に問題の部分だけ記載します。
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
   同じ内容のデータを964320回書き込んでいる。(恐らく先頭アドレスの内容をずっと書き込   んでいる)
 [1.4] 今何がわからないのか、知りたいのか
 for文で回して、先頭アドレスから次のアドレス(n+1)の内容を書き込みたい。
 
[2] 環境  
 [2.1] OS : Windows, Linux等々
   Ubuntu12.04
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
GCC

[3] その他
 ・どの程度C言語を理解しているか
大学で初歩の初歩を教わった程度

コード:

unsigned char* imagebuffer = NULL;
	res = pImage -> get(&imagebuffer);
	if(res != BGAPI_RESULT_OK)
	{
                printf("BGAPI::Image::getエラー: %d\n" ,res);
		return 0;
	}

FILE* fp;
	fp = fopen("R", "wb");
	for(i=0;i<=964320;i++){
	fwrite(&imagebuffer,sizeof(unsigned char),1,fp);
	imagebuffer++;
	}
	fclose(fp);
	printf("write\n");
何かまずい点、こうしたらいい点がありましたらお教えください。

アバター
みけCAT
記事: 6312
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: バイナリファイルの書き出しについて

#2

投稿記事 by みけCAT » 6年前

fwriteに渡すべきなのは&imagebufferではなくてimagebufferなのではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あすぱら
記事: 12
登録日時: 6年前

Re: バイナリファイルの書き出しについて

#3

投稿記事 by あすぱら » 6年前

レスありがとうございます。
みけCATさんの言われた通り、「imagebuffer」を渡したところ、プログラムが途中で停止してしまいました。(コンソールにwriteが表示されませんでした。)
一応、バイナリファイルが出来ていたので見たところ容量が1.3MBありました。計算上ですと964.32KBのファイルとなるはずですので、まだ何かおかしいでしょうか?

アバター
usao
記事: 1598
登録日時: 7年前

Re: バイナリファイルの書き出しについて

#4

投稿記事 by usao » 6年前

964320回書き込むなら 11行目は <= ではなく < とすべきではないでしょうか?
オフトピック
「1byte書き込むことを964320回やる」ことに何か特別な理由があるのでなければ
「964320byte書き込むことを1回やる」でいいような.
[追記]
iの型はintか何かでしょうか?
とりあえずfor文の中が何回回っているかを確認されてみては?

あすぱら
記事: 12
登録日時: 6年前

Re: バイナリファイルの書き出しについて

#5

投稿記事 by あすぱら » 6年前

>>usao
レスありがとうございます。
書き込みを1度にやってはどうかとアドバイスを受けて、コードは以下のように修正しました。
fwriteの項目数を963420にしました。

コード:

unsigned char* imagebuffer = NULL;
    res = pImage -> get(&imagebuffer);
    if(res != BGAPI_RESULT_OK)
    {
                printf("BGAPI::Image::getエラー: %d\n" ,res);
        return 0;
    }
 
FILE* fp;
    fp = fopen("R", "wb");
    fwrite(&imagebuffer,sizeof(unsigned char),963420,fp);
    fclose(fp);
    printf("write\n");
実行したところ、323.6KBのバイナリファイルとなってしまいました。上記のコードで間違いがありますか?

アバター
usao
記事: 1598
登録日時: 7年前

Re: バイナリファイルの書き出しについて

#6

投稿記事 by usao » 6年前

おっと,また fwrite()の第一引数が &imagebuffer になっていますよ.

ファイルサイズがおかしくなる理由はわかりませんが
とりあえず,
・2行目の後で,imagebufferの値がNULLでないことを確認
・fopen()直後に,fpの値がまともかどうかを確認
・fwrite()の戻り値チェック(エラーじゃないかどうか)
くらいは入れておきたいですね.
オフトピック
コードから推測するにbaumerのやつを使っているのかな?
同じコードでも日によって(?)動いたり動かなかったりで,カメラから絵を取るときにえらく苦労したような記憶が.

あすぱら
記事: 12
登録日時: 6年前

Re: バイナリファイルの書き出しについて

#7

投稿記事 by あすぱら » 6年前

>>usao
アドバイスありがとうございます。以下に記載された事を調べるためにコードを修正しました。

コード:

unsigned char* imagebuffer = NULL;
	res = pImage -> get(&imagebuffer);
	printf("imagebuffer:%d\n",imagebuffer);
	if(res != BGAPI_RESULT_OK)
	{
                printf("BGAPI::Image::getエラー: %d\n" ,res);
		return 0;
	}
	printf("imagebuffer:%d\n",res);

	FILE* fp;
	fp = fopen("R", "wb");
	printf("fp:%d\n",fp);
	for(i=0;i<964320;i++){
	res=fwrite(imagebuffer,sizeof(unsigned char),1,fp);
	printf("%d\n",res);
	printf("%d\n",i);
	imagebuffer++;
	}
	fclose(fp);
	printf("write\n");
上のコードを元に以下を解答致します。
・2行目の後で,imagebufferの値がNULLでないことを確認
 値は「-1297069832」
・fopen()直後に,fpの値がまともかどうかを確認
値は「174192632」(すいません。この値がまともかどうかの判断はどのようにするのでしょうか)
・fwrite()の戻り値チェック(エラーじゃないかどうか)
 常に「1」が返っているのでエラーではないと思います。

「i」についてはint型で間違いないです。
for文は325383回回った所で止まってしまいます。
恐らくfor文が途中で止まってしまうので、ファイルサイズがおかしいと思うのですが、止まってしまう理由がさっぱりわかりません。

お察しの通りbaumerのカメラから絵を取るためにしくはくしている所です。やはり意外と難しいのですね。

アバター
みけCAT
記事: 6312
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: バイナリファイルの書き出しについて

#8

投稿記事 by みけCAT » 6年前

964320バイトという値は、本当に取得しようとしている絵のサイズと合っていますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: バイナリファイルの書き出しについて

#9

投稿記事 by へにっくす » 6年前

考えられるのは、pImage->getで得たバッファサイズが964320バイトもないってことですね。

みけCATさんとかぶりますが、
そもそも964320バイトってのはどこからきた?
pImageの型が不明なのであてずっぽうなのですが、必要なサイズはいくらか得る関数とかあったりしないですかね。

#baumerのカメラですか
#それは実際に使っている人から聞かないとだめですねえ・・・
written by へにっくす

あすぱら
記事: 12
登録日時: 6年前

Re: バイナリファイルの書き出しについて

#10

投稿記事 by あすぱら » 6年前

>>みけCAT

964320ばいとは以下の式から求めました。

解像度×RGB24ビット=656×490×3=964320

>>へにっくす
レスありがとうございます。

必要なバイト数は上記で求めたのですが、もしかしたらRGB24ビットで画像を取得してない可能性も思いつきました。このカメラにはモノラル8ビットで画像を取得する事も出きるのです。もしその場合は必要なバイト数は321440バイトとなり、現在取得出来ているバイナリファイルのサイズ324493に近いサイズになります。
もう一度初期設定を見直してみます。

アバター
usao
記事: 1598
登録日時: 7年前

Re: バイナリファイルの書き出しについて

#11

投稿記事 by usao » 6年前

解像度やBPP等といった情報はカメラのクラスあたりから取得できたと思いますので,
実際にそれ用のメソッドで問い合わせてサイズを取得すべきですね.

実際にそこらへんのサイズが違ってるのが原因なのかわかりませんが
>325383回
ってのが奇数なのがなんとなく不自然な雰囲気ですね…
なんか変なサイズでの部分切り出しみたいな設定になってるとか?

#あと,関係ないと思いますが,カメラにイメージをセットしても
 一回画像キャプチャされるとそのセットが解除されるから毎回セットし直す必要がある,
 みたいな感じだったような記憶がありますが,そういう別のところで何かおかしなことになっているとか…?

オフトピック
fwrite()って,
void *p = 何か適当な値;
fwrite( p, sizeof(unsigned char), 1, fp );
とか書いたら
pの指す場所がどこであろうが,とりあえずそこの値を吐き出しそうな気がするけど
場合によってはフリーズし得るのか…?

アバター
みけCAT
記事: 6312
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: バイナリファイルの書き出しについて

#12

投稿記事 by みけCAT » 6年前

usao さんが書きました:実際にそこらへんのサイズが違ってるのが原因なのかわかりませんが
>325383回
ってのが奇数なのがなんとなく不自然な雰囲気ですね…
なんか変なサイズでの部分切り出しみたいな設定になってるとか?
確保された領域の外にアクセスしても、すぐにアクセス違反になるとは限りません。
「未定義」です。
usao さんが書きました:
オフトピック
fwrite()って,
void *p = 何か適当な値;
fwrite( p, sizeof(unsigned char), 1, fp );
とか書いたら
pの指す場所がどこであろうが,とりあえずそこの値を吐き出しそうな気がするけど
場合によってはフリーズし得るのか…?
とりあえずそこの値を吐き出そうとして、そこへの読み取りアクセスが(OSなどによって)禁止されていればアクセス違反になると思います。
フリーズするケースがあるかは知りません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あすぱら
記事: 12
登録日時: 6年前

Re: バイナリファイルの書き出しについて

#13

投稿記事 by あすぱら » 6年前

初期設定を見直したところ、やはりRGB8ビットで動作していませんでした。設定を変更しfor文で回したところ、無事にバイナリファイルとして書き出す事が出来ました。

アドバイス頂いた皆さんありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る