我有一个客户端 - 服务器系统,其中服务器是用cpp编写的,客户端是用Java编写的(Android应用程序)。
服务器使用read方法将本地目录中的图像作为ifstream读取。 读取过程在循环内完成,程序每次都读取部分图像。每次读取图像的一部分时,它都会通过套接字发送到客户端,该客户端收集byteBuffer中的所有部分,并且当图像的所有字节都转移到客户端时,客户端会尝试将其转换为字节数组(在使用byteBuffer.array()方法之后)到Bitmap中。 这就是问题的开始 - 我尝试了一些方法,但似乎我无法将这个字节数组转换为位图。
根据我的理解,这个字节数组可能是图像的原始表示,不能使用BitmapFactory.decodeByteArray()等方法对其进行解码,因为它首先没有编码。 / p>
最终,我的问题是 - 如何处理这个字节数组,以便我能够将图像设置为ImageView的源?
注意:我已经确保所有数据都通过套接字正确发送,并按正确的顺序收集这些数据。
客户代码:
byte[] image_bytes
byte[] response_bytes;
private void receive_image ( final String protocol, final int image_size, final int buffer_size)
{
if (image_size <= 0 || buffer_size <= 0)
return;
Thread image_receiver = new Thread(new Runnable() {
@Override
public void run() {
ByteBuffer byteBuffer = ByteBuffer.allocate(image_size);
byte[] buffer = new byte[buffer_size];
int bytesReadSum = 0;
try {
while (bytesReadSum != image_size) {
activeReader.read(buffer);
String message = new String(buffer);
if (TextUtils.substring(message, 0, 5len_of_protocol_number).equals(protocol)) {
int bytesToRead = Integer.parseInt(TextUtils.substring(message,
len_of_protocol_number,
len_of_protocol_number + len_of_data_len));
byteBuffer.put(Arrays.copyOfRange(buffer,
len_of_protocol_number + len_of_data_len,
bytesToRead + len_of_protocol_number + len_of_data_len));
bytesReadSum += bytesToRead;
} else {
response_bytes = null;
break;
}
}
if (bytesReadSum == image_size) {
image_bytes = byteBuffer.array();
if (image_bytes.length > 0)
response_bytes = image_bytes;
else
response_bytes = null;
}
} catch (IOException e) {
response_bytes = null;
}
}
});
image_receiver.start();
try {
image_receiver.join();
} catch (InterruptedException e) {
response_bytes = null;
}
if (response_bytes != null)
{
final ImageView imageIV = (ImageView) findViewById(R.id.imageIV);
File image_file = new File(Environment.getExternalStorageDirectory(), "image_file_jpg");
try
{
FileOutputStream stream = new FileOutputStream(image_file);
stream.write(image_bytes);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
//Here the method returns null
final Bitmap image_bitmap = BitmapFactory.decodeFile(image_file.getAbsolutePath());
main.this.runOnUiThread(new Runnable() {
@Override
public void run() {
imageIV.setImageBitmap(image_bitmap);
imageIV.invalidate();
}
}
}
}
答案 0 :(得分:0)
每当您通过套接字在两台不同架构的机器之间交换数据时,您需要知道每台机器的Endianness(big-endian / little-endian)。如果不同,则需要转换字节以更正数据。也许这就是你的问题。以下是示例代码的链接:Converting Little Endian to Big Endian。您应该能够轻松找到更多解释该概念的文章。
答案 1 :(得分:0)
事实证明我的发送协议出了问题。 修补它后它确实有效。 谢谢你的帮助。