Android - BitmapFactory.decodeByteArray возвращает ноль - PullRequest
1 голос
/ 14 мая 2011

Я пытаюсь передать изображение с ПК на Android с помощью сокета. Я могу получать данные с компьютера на телефон, но когда я передаю byte[] в BitmapFactory, он возвращает ноль. Также иногда возвращается изображение, но не всегда.

Размер изображения 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 Ответ

3 голосов
/ 14 мая 2011

Я не знаю, поможет ли это в вашем случае, но в целом вы не должны полагаться на 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;
    }
}
...