ndsでのjpeg表示に再挑戦(1)
以前、jpegの表示に挑戦してどこかから持ってきたソースを使って表示を試みたのですが、うまくデコードできないものがあったりと、途中、保留状態でした。そこで、jpegの表示に再挑戦したいと思います。
せっかく、再挑戦するので、何か目標が無いかと考えて「美人の女の人が時刻を書いたパネルを持って立っているあれ」を表示してみたいと思い立ちました。そこで、挑戦です。
先ず、jpg画像データを取得するところから考えていきます。
美人さんの画像を取得する
画像の取得は、dswifiを用いてサーバにhttpアクセスしてGETコマンドで取得すればいいはずです。実は以前ブログに書いたように、過去にこのようなものを作っています。
これは、PC上で美人時計画像を取得して、DSの画像フォーマットに変換してDSに転送するような仕組みで実現しています。このような仕組みになったのは、DSから画像を取得する方法とjpegをデコードする方法がよくわかっていなかったからです。
今回、画像を取得するところを作ってみました。
とりあえず、PCが送信する情報をそのまんま送信しています。
FILE* fp = NULL; char toptext[512]; int i; char *servername = "www.bijint.com"; char *getfilename = "/jp/img/clk/"; char buf[32]; char savefilename[32]; int httpgetdatasize = 32768; int portnum = 80; time_t unixTime = time( NULL ); struct tm* timeStruct = gmtime((const time_t *)&unixTime); sprintf( buf, "%02d%02d.jpg", timeStruct->tm_hour, timeStruct->tm_min ); strcpy( savefilename, buf ); //********** http GET コマンド生成 ********** strcpy( toptext, "GET " ); strcat( toptext, getfilename ); strcat( toptext, buf ); strcat( toptext, " HTTP/1.1\r\n" ); strcat( toptext, "Host: " ); strcat( toptext, servername ); strcat( toptext, "\r\n" ); strcat( toptext, "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7\r\n" ); strcat( toptext, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" ); strcat( toptext, "Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\n" ); strcat( toptext, "Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7\r\n" ); strcat( toptext, "Keep-Alive: 300\r\n" ); strcat( toptext, "Connection: keep-alive\r\n" ); strcat( toptext, "Referer: http://www.bijint.com/jp/\r\n\r\n" ); //******************************************* ShinoPrintBox( MainScreenA, 0, 0, (u8*)toptext, 40, RGB(31,31,31), RGB(0,0,0), 1 ); nkeywait( -1 ); anyNyuryoku(); // サーバのIPアドレスを検索します struct hostent * myhost = gethostbyname( servername ); //TCPソケットの生成 int my_socket = socket( AF_INET, SOCK_STREAM, 0 ); //ホストに接続するため、指定IPアドレスの指定ポートに接続します。 struct sockaddr_in sain; sain.sin_family = AF_INET; sain.sin_port = htons( portnum ); //ポート指定 sain.sin_addr.s_addr= *( (unsigned long *)(myhost->h_addr_list[0]) ); //IP指定 connect( my_socket,(struct sockaddr *)&sain, sizeof(sain) ); //接続先にファイル取得リクエストを飛ばします send( my_socket, toptext, strlen(toptext), 0 ); //メモリの確保 char *incoming_buffer = (char*)malloc( sizeof(char*) * httpgetdatasize ); if(incoming_buffer==NULL ){ ShinoPrint( SubScreenA, 0, 0, (u8 *)"Malloc Error", RGB(31,0,0), 0, 1 ); while( true ); } //最初の返信データを受信 int recvd_len = recv( my_socket, incoming_buffer, httpgetdatasize, 0 ); recvd_len = strlen( (char *)incoming_buffer ); //最初の受信分だけ LOGに保存して終了。 fp = fopen( savefilename, "wb" ); if( fp==NULL ){ ShinoPrintCenter( SubScreenA, 128, 12*12, (u8 *)"not create.", RGB(31,0,0), 0, 1 ); while( true ); } fwrite( incoming_buffer, recvd_len, sizeof(char), fp ); //データサイズが0になるまで、データを取得します while( ( recvd_len = recv( my_socket, incoming_buffer, httpgetdatasize, 0 ) ) != 0 ){ if( recvd_len>0 ){ swiWaitForVBlank(); fwrite( incoming_buffer, recvd_len, sizeof(char), fp ); } } fclose( fp ); //メモリの開放 free( incoming_buffer ); //ソケットをシャットダウンします shutdown(my_socket,0); //少し間をおく(こうしないとソケットが切れない・・・) for( i=0; i<20; i++ ){ swiWaitForVBlank(); } //ソケットを閉じます closesocket( my_socket );
結果、NGです。何が問題かと言うと、取得データが473バイト少ないのです。この原因はヘッダなのかWiFi側なのか、ndsのプログラムなのか、原因を調べなければ生りません。
今日は、ここまでです。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム