Android - BitmapFactory.decodeByteArray返回null

时间:2011-05-14 13:24:40

标签: android serversocket bitmapfactory

我正在尝试使用套接字连接将图像从pc传输到android。我能够从pc到手机接收数据但是当我将byte[]传递给BitmapFactory时,它返回null。有时它会返回图像,但并非总是如此。

图片大小为40054 bytes。我一次收到2048 bytes,因此创建了保存byte数据的小数据池(缓冲区)。收到完整数据后,我将其传递给BitmapFactory。这是我的代码:

byte[] buffer = new byte[40054];
byte[] temp2kBuffer = new byte[2048]; 
int buffCounter = 0;
for(buffCounter = 0; buffCounter < 19; buffCounter++)
{
    inp.read(temp2kBuffer,0,2048);  // this is the input stream of socket
    for(int j = 0; j < 2048; j++)
    {
        buffer[(buffCounter*2048)+j] = temp2kBuffer[j];
    }
}
byte[] lastPacket=new byte[1142];
inp.read(lastPacket,0,1142);
buffCounter = buffCounter-1;
for(int j = 0; j < 1142; j++)
{
    buffer[(buffCounter*2048)+j] = lastPacket[j];
}
bmp=BitmapFactory.decodeByteArray(buffer,0,dataLength); // here bmp is null

计算

[19 data buffers of 2kb each] 19 X 2048 = 38912 bytes
[Last data buffer] 1142 bytes
38912 + 1142 = 40054 bytes [size of image]

我也曾尝试一次读取完整的40054字节,但这也没有用。这是代码:

inp.read(buffer,0,40054);
bmp=BitmapFactory.decodeByteArray(buffer,0,dataLength); // here bmp is null

最后也检查了decodeStream但结果是一样的。

知道我做错了吗?

由于

1 个答案:

答案 0 :(得分:3)

我不知道这对你的情况是否有帮助,但一般来说你不应该依赖InputStream.read(byte [],int,int)来读取你要求的确切字节数。它只是最大值。如果查看InputStream.read文档,可以看到它返回了您应该考虑的实际读取字节数。

通常在从InputStream加载所有数据时,并希望在读取所有数据后关闭它,我会这样做。

ByteArrayOutputStream dataBuffer = new ByteArrayOutputStream();
int readLength;
byte buffer[] = new byte[1024];
while ((readLength = is.read(buffer)) != -1) {
    dataBuffer.write(buffer, 0, readLength);
}
byte[] data = dataBuffer.toByteArray();

如果你只需要加载一定数量的数据,你就知道它的大小。

byte[] data = new byte[SIZE];
int readTotal = 0;
int readLength = 0;
while (readLength >= 0 && readTotal < SIZE) {
    readLength = is.read(data, readTotal, SIZE - readTotal);
    if (readLength > 0) {
        readTotal += readLength;
    }
}