从android部分发送图像并从pc接收,但图像已损坏

Send image from android part and receive it from pc, but the image is corrupted

本文关键字:图像 接收 已损坏 pc android      更新时间:2023-10-16

我正试图通过套接字和PC部分从我的android手机发送jpeg图像,获取发送的数据并将其存储在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 );

我还必须提到,当我用纯C++的PC客户端应用程序发送图像数据时,接收部分工作良好。

有没有任何想法是什么问题,为什么我得到损坏的图像发送从安卓设备?

非常感谢。

已编辑我将此添加到android应用程序中,以测试发送字节是否可以形成良好的图像?我保存了图像,它是好的。

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();

我认为您应该使用Bitmap类将图像转换为ByteBuffer,然后发送它,在另一端将ByteBuffer转换为图像。

在发送方

Bitmap bitmap = BitmapFactory.decodeFile("ImageD2.jpg");
int bytes = bitmap.getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(bytes);
bitmap.copyPixelsToBuffer(buffer);
byte[] array = buffer.array();

现在您可以将byte[]作为正常数据发送。

在接收端

正常接收阵列并将其转换回Bitmap

 Bitmap bitmap = BitmapFactory.decodeByteArray(array , 0, array .length);

有关更多信息,您可以阅读以下问题

将位图转换为byteArray安卓

如何将字节数组转换为位图

我找到了解决方案。问题出在安卓方面。所以我做了以下更改:

我将DataOutputStreamDataInputStream分别更改为BufferedOutputStreamBufferedInputStream

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();
     ...
     ...
     ...

}此处的catch语句