从android部分发送图像并从pc接收,但图像已损坏
Send image from android part and receive it from pc, but the image is corrupted
我正试图通过套接字和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安卓
如何将字节数组转换为位图
我找到了解决方案。问题出在安卓方面。所以我做了以下更改:
我将DataOutputStream
和DataInputStream
分别更改为BufferedOutputStream
和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();
...
...
...
}此处的catch语句
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 使用流处理接收到的数据
- 从udp接收帧对于人脸识别来说太慢
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 当通过tcp接收编码图像的消息时,zmq在第二个循环中崩溃
- 如何使用 C# 显示接收到的图像
- 如何通过串行端口接收 JPEG 图像
- 套接字编程 -- 发送和接收图像
- 如何同步每20毫秒更新一次的接收图像
- 接收sensor_msgs::将图像作为ros消息中的数据成员
- c++套接字接收图像并显示而不保存
- 通过套接字从Java向CPP发送屏幕截图-发出接收图像
- 从android部分发送图像并从pc接收,但图像已损坏
- 如何发送/接收例如图像(.png, .jpg)
- 如何将视频文件作为输入传递给NodeJS中的子进程,并接收帧/图像作为输出
- 如何接收打开的简历图像在安卓手机
- 通过http GET请求接收JPEG图像
- 通过Qt中的串行端口接收图像