jpeg
Androidフォンからソケットを介してPC部分から画像を送信し、送信されたデータを取得してjpg
ファイルに保存しようとしています。
PCからAndroidにデータ(バイナリファイル)をダウンロードして正しく保存できるので、ソケットを正しく構成したと確信しています。
Android から PC に送信されるストリームを読み取ることもできます。パケットの長さとヘッダー情報は、まさに私が期待するものです。
問題は画像データの読み取りにあります。画像データのサイズは同じですが、.jpg
ファイルに保存すると破損して表示できません。
ヘッダー情報を送信した後に画像ファイルを送信しようとする私の Android コードは次のとおりです。
try{
//packagesize is header information which is sent in advance
index.putInt(packagesize);
byte c[]= {index.get(3),index.get(2),index.get(1),index.get(0)};
InputStream jpgimage = new FileInputStream(fileimage);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
int writeBytes = 0,len = 0;
byte buffer[] = new byte[1024];
while((len = jpgimage.read(buffer,0,buffer.length))!=-1)
{
writeBytes+=len;
dataOutputStream.write(buffer,0,len);
}
dataOutputStream.flush();
jpgimage.close();
dataInputStream.close();
dataOutputStream.close();
...
...
...
}
catch statements here
これは、PC 部分の受信コードです。
// after reading header information I try to read image data
char *buff = malloc(sizeof(char) * jpeg_length);
unsigned int byteCount = 0;
unsigned int byteCount = 0;
do
{
int ret = recv(socket, buff+readBytes, jpeg_length-readBytes, 0);
if (ret <= 0)
{
fprintf(stderr,"Error receiving jpeg file.\n");
fclose( output );
return 106;
}
readBytes += ret;
fwrite(buff, sizeof(char), readBytes, output);
}
while (readBytes < jpeg_length);
fclose( output );
また、純粋なPCクライアントアプリケーションで画像データを送信すると、受信部分が正常に機能していることにも言及する必要がありますC++
。
何が問題なのか、なぜ Android デバイスから送信された画像が破損するのかについて何か考えはありますか?
感謝します。
編集済み 送信バイトが適切な画像を形成できるかどうかをテストするために、これを Android アプリケーションに追加しますか? 画像保存したらOKでした。
int writeBytes = 0,len = 0;
byte buffer[] = new byte[1024];
// Here I save all sending bytes to an image called test.jpg
String path = "sdcard/download/images/test.jpg";
FileOutputStream stream = new FileOutputStream(path);
while((len = jpgimage.read(buffer,0,buffer.length))!=-1)
{
writeBytes+=len;
stream.write(buffer);
dataOutputStream.write(buffer,0,len);
dataOutputStream.flush();
}
stream.flush();
dataOutputStream.flush();
jpgimage.close();
dataInputStream.close();
dataOutputStream.close();