我通过蓝牙以编程方式发送图像。当我在发送端发送图像作为字节数组时,字节数组长度为= 83402,在接收端,我得到的字节数为1024.
我想将这1024个批次组合成单字节数组,以便我再次将其转换为图像。
在msg.obj中我得到1024 bacth的字节数组。
案例MESSAGE_READ:
byte[] readBuf = (byte[]) msg.obj;
Bitmap bmp=BitmapFactory.decodeByteArray(readBuf,0,readBuf.length);
之后我也收到了这个警告..
“BufferedOutputStream构造函数中使用的默认缓冲区大小。如果需要8k缓冲区,最好是明确的”
任何帮助将不胜感激。
由于
答案 0 :(得分:1)
大致应该是这样的:
byte[] readBuf = new byte[83402]; // this array will hold the bytes for the image, this value better be not hardcoded in your code
int start = 0;
while(/*read 1024 byte packets...*/) {
readBuf.copyOfRange((byte[]) msg.obj, start, start + 1024); // copy received 1024 bytes
start += 1024; //increment so that we don't overwrite previous bytes
}
/*After everything is read...*/
Bitmap bmp=BitmapFactory.decodeByteArray(readBuf,0,readBuf.length);
答案 1 :(得分:0)
我将在这里走出困境并假设您正在使用sdk中的BluetoothChat example来构建您的图像发送者(所有示例都与之匹配)。这是一个快速转换,我把它放在一起 - 可能不是最好的,但它有效。
你正在以1024的批量获取它们,因为在BluetoothChatService.java运行函数中它创建了一个大小为1024的缓冲区数组,它从输入流中获取信息。如果您创建另一个适合图像的缓冲区(我设置了最大1mb),那么您的运行函数将具有:
byte[] buffer = new byte[1024];
byte[] imgBuffer = new byte[1024*1024];
int pos = 0;
使用你的pos变量跟踪你在imgBuffer中的位置。
然后你只需要在图像的while(true)循环中获取块时将其复制过来(mmInStream是一个InputStream):
int bytes = mmInStream.read(buffer);
System.arraycopy(buffer,0,imgBuffer,pos,bytes);
pos += bytes;
我发送消息让它知道图像已完成发送,然后将imgBuff传递给另一个线程(此时pos的大小为imgBuffer):
mHandler.obtainMessage(BluetoothChat.IMAGE_READ, pos, -1, imgBuffer)
.sendToTarget();
我已经定义了IMAGE_READ解码数组,就像在MESSAGE_READ中一样:
byte[] readBuf = (byte[]) msg.obj;
BitmapFactory.decodeByteArray(readBuf, 0, msg.arg1);