RuntimeException: буфер не достаточно большой для пикселей

Я получаю битмап в массиве байтов через сокет, и я его читаю, а затем я хочу установить его os.toByteArray как ImageView в моем приложении. Код, который я использую:

 try { //bmp = BitmapFactory.decodeByteArray(result, 0, result.length); bitmap_tmp = Bitmap.createBitmap(540, 719, Bitmap.Config.ARGB_8888); ByteBuffer buffer = ByteBuffer.wrap(os.toByteArray()); bitmap_tmp.copyPixelsFromBuffer(buffer); Log.d("Server",result+"Length:"+result.length); runOnUiThread(new Runnable() { @Override public void run() { imageView.setImageBitmap(bitmap_tmp); } }); return bmp; } finally { } 

Когда я запускаю свое приложение и начинаю принимать Byte[] и ожидаю, что ImageView будет изменен, это не так.

LogCat говорит:

 java.lang.RuntimeException: Buffer not large enough for pixels at android.graphics.Bitmap.copyPixelsFromBuffer 

Я искал в похожих вопросах, но не смог найти решение моей проблемы.

Взгляните на источник (версия 2.3.4_r1, последний раз Bitmap был обновлен в Grepcode до 4.4) для Bitmap :: copyPixelsFromBuffer ()

Формулировка ошибки несколько нечеткая, но код уточняет – это означает, что ваш буфер вычисляется как не имеющий достаточного количества данных для заполнения пикселей вашего растрового изображения. Это (возможно), потому что они используют метод оставшегося () метода buffer для определения емкости буфера, который учитывает текущее значение его атрибута position. Если вы вызываете перемотку () в буфер, прежде чем вы будете вызывать copyFromPixels (), вы можете увидеть, что исключение во время выполнения исчезнет. Я говорю «могу», потому что метод ByteBuffer :: wrap () должен устанавливать значение атрибута позиции равным нулю, устраняя необходимость перемотки назад, но, судя по подобным вопросам, и мой собственный опыт, сброс позиции явно может сделать трюк.

Пытаться

 ByteBuffer buffer = ByteBuffer.wrap(os.toByteArray()); buffer.rewind(); bitmap_tmp.copyPixelsFromBuffer(buffer); 
Intereting Posts