Android - BitmapFactory.decodeByteArray возвращает ноль

1

Я пытаюсь перенести изображение с ПК на андроид, используя соединение сокета. Я могу получить данные с ПК на телефон, но когда я передаю 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, но результат был таким же.

Любая идея, где я делаю неправильно?

Спасибо

Теги:
serversocket
bitmapfactory

1 ответ

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;
    }
}
  • 0
    выглядит полезным ... позвольте мне проверить это ... Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню