1

jpegAndroidフォンからソケットを介して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();
4

2 に答える 2

1

その解決策を見つけました。問題はAndroid側からでした。そこで、次の変更を行いました。

私はDataOutputStreamDataInputStreamBufferedOutputStreamと にBufferedInputStreamそれぞれ変更しました:

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 BufferedOutputStream(socket.getOutputStream());
    dataInputStream = new BufferedInputStream(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();

     ...
     ...
     ...

ここでステートメントをキャッチ

于 2013-07-05T04:03:31.947 に答える