【问题标题】:Send image from android part and receive it from pc, but the image is corrupted从android部分发送图像并从pc接收它,但图像已损坏
【发布时间】:2013-07-01 23:02:41
【问题描述】:

我正在尝试通过套接字和 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 设备发送的图像损坏?

欣赏它。

已编辑 我将此添加到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();

【问题讨论】:

    标签: java android c++ sockets fileoutputstream


    【解决方案1】:

    我认为您应该使用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);
    

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

    Converting bitmap to byteArray android

    How to convert byte array to Bitmap

    【讨论】:

    • 我的接收方不是java。那么如何将 byteArray 解码为位图并将其保存到 c++ PC 部分中的 jpeg 文件?顺便说一句,那真的能解决问题吗。因为我可以在 android 部分将字节正确保存到图像中(请参阅编辑后的帖子)
    • @HamidBazargani 尝试将这些字节直接写入文件。
    • 没有用。它在接收端读取时进入无限循环。
    • 你能显示你发送文件大小的代码吗?你考虑过字节顺序吗?以防万一。我在 PC-Android 两面都进行了很多图像传输,它可以在没有问题的情况下工作。
    • @ja_mesa 在发送图像之前,我发送 4 字节的文件大小作为标题数据的一部分。我正确地在PC中得到它。请把PC-Android转移的代码发给我吗
    【解决方案2】:

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

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

    } 在此处捕获语句

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 2014-08-16
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 2020-12-19
      • 2021-07-10
      相关资源
      最近更新 更多