トップページ > 過去ログ > 記事閲覧
受信した画像データからグラフィックハンドルを作成する方法
名前:モンペチ 日時: 2008/01/23 12:50

はじめまして,モンペチと申します. 通信対戦ゲームを作っているのですが,自分のアイコンを相手に表示してもらうために,画像データを送信し合って,受信したデータから画像ハンドルを作成したいと思っています. 以下のようなプログラムを用いて,同一PCでの重複起動により通信をすると MyIcon.jpg と test.jpg は同じ画像になるはずなのですが,バイナリエディタで中身を見たところ,サイズは等しいのですがデータがでたらめなものになっていました. 関係ないとは思いますが,SetUseDXNetWorkProtocol(FALSE); として,DxLibの通信形態は使用しておりません. どなたか,おわかりいただけるようならご教授の程お願いします. void ChangeIcon() { FILE *fp; int i; int MySize, YourSize; unsigned char *MyData, *YourData; fp = fopen("MyIcon.jpg", "rb"); fseek(fp, 0L, SEEK_END); MySize = ftell(fp); fseek(fp, 0L, SEEK_SET); MyData = (unsigned char *)malloc(MySize); fread(MyData, MySize, 1, fp); fclose(fp); /***** ファイルのサイズを教え合う *****/ NetWorkSend(NetHandle, &MySize, sizeof(int)); while(!ProcessMessage() && GetNetWorkDataLength(NetHandle) <= 0) WaitTimer(100); NetWorkRecv(NetHandle, &YourSize, sizeof(int)); /**************************************/ YourData = (unsigned char *)malloc(YourSize); /********** ファイルの送受信 **********/ NetWorkSend(NetHandle, &MyData, MySize); while(!ProcessMessage() && GetNetWorkDataLength(NetHandle) <= 0) WaitTimer(100); NetWorkRecv(NetHandle, YourData, YourSize); /**************************************/ YourIcon = CreateGraphFromMem(YourData, YourSize); if(host == SERVER) { if((fp = fopen("test.jpg", "wb")) != NULL) fwrite(&YourData, YourSize, 1, fp); fclose(fp); } free(MyData); free(YourData); }

Page: 1 | 2 |

Re: 受信した画像データからグラフィックハンドルを作成する方法 ( No.1 )
名前:Will 日時:2008/01/23 19:47

この部分ですけど > while(!ProcessMessage() && GetNetWorkDataLength(NetHandle) <= 0) while(!ProcessMessage() && GetNetWorkDataLength(NetHandle) < MySize) に変更するか「通信待ち」というスレッドにある修正版のDXライブラリを使用すれば正しく動作するのではないでしょうか? ○余談 > fp = fopen("MyIcon.jpg", "rb"); > fseek(fp, 0L, SEEK_END); バイナリファイルに対しSEEK_ENDを指定した場合のfseekの動作はC言語では保障されていません。 fpが本当にファイルの最後に移動しているかどうかはコンパイラ次第と言うことになります。 ttp://www.bohyoh.com/CandCPP/C/Library/fseek.html
Re: 受信した画像データからグラフィックハンドルを作成する方法 ( No.2 )
名前:モンペチ 日時:2008/01/23 21:53

>>Wii様 コメントありがとうございます. > while(!ProcessMessage() && GetNetWorkDataLength(NetHandle) <= 0) の部分ですが,ご指摘されたように while(!ProcessMessage() && GetNetWorkDataLength(NetHandle) < MySize) にすると,このループから抜け出せないので上記の判定にしています. (ループから抜け出せても CreateGraphFromMem の戻り値は -1 なのですが…) 修正版のDXライブラリを使用しても改善されませんでした. > バイナリファイルに対しSEEK_ENDを指定した場合のfseekの動作はC言語では保障されていません。 リファレンスページの CreateGraphFromMem() 関数のサンプルプログラムを流用したのですが そのようなルールは知りませんでした.今後,バイナリファイルを扱うときは意識したいと思います.

Page: 1 | 2 |