Загрузите изображение jpg из Интернета, сохранив его в байтовом массиве в оперативной памяти

1

Im пытается загрузить jpg-изображение из сети, сохраняя его в массиве байтов, чтобы иметь сжатое изображение на баране, пока я не покажу его, но Im получает черное изображение.

Что я делаю:

URL myFileUrl =null; 

myFileUrl= new URL(fileUrl);

HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
conn.setUseCaches(false);

InputStream is = conn.getInputStream();

byte[] ba = new byte[is.available()];

После этого Im сохраняет массив в ОЗУ, пока я не буду использовать его.

Чтобы разместить его, я делаю:

Bitmap bitmapFromByteArray = BitmapFactory.decodeByteArray(ba,0,ba.length);

imageView1.setImageBitmap(bitmapFromByteArray);

bitmapFromByteArray.recycle();

Я решил проблему, выполнив

URL myFileUrl =null; 

myFileUrl= new URL(fileUrl);

HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();

InputStream is = conn.getInputStream();

Bitmap bm = BitmapFactory.decodeStream(is);

int size = bm.getWidth() * bm.getHeight();

ByteArrayOutputStream out = new ByteArrayOutputStream(size);
bm.compress(Bitmap.CompressFormat.JPEG, 100, out);

byte[] ba2 = out.toByteArray();
bm.recycle()

Buut, делая это Im, декодирует JPEG, а затем повторно кодирует изображение, несколько раз снижая качество изображения и используя ресурсы телефона дольше, чем необходимо. Кроме того, битмап, который я получаю после повторного кодирования, больше, чем исходное jpg-изображение.

Есть ли способ получить первый метод?

Спасибо.

Теги:

2 ответа

0
Лучший ответ

Вы пытаетесь просто скопировать содержимое InputStream в массив байтов?

Вы можете сделать это напрямую с помощью цикла, который вызывает InputStream#read в массив байтов, или вы можете оставить реализацию до других, используя IOUtils.toByteArray из общей суммы Apache.

Изменить. Вам не нужно иметь дело с инициализацией массива, если вы используете метод Apons commons:

byte[] bytes = null;
try {
    bytes = IOUtils.toByteArray(conn.getInputStream());
} catch (IOException e) {
    // handle the exception
}

toByteArray использует ByteArrayOutputStream, чтобы избежать выделения массива вверх, но вам не нужно беспокоиться об этом.

  • 0
    Да, я знаю, что это нубский вопрос. проблема в том, что я понятия не имею, как инициализировать массив байтов. как долго это должно быть? Случайно ли у вас есть пример Apache Commons (IOUtils)?
  • 0
    Спасибо. Приложение, которое раньше выкидывало memoryOutOfBoundsException (когда я сохранял изображения как растровые изображения), нет, я не могу сохранить их как jpg (или вид jpg) и сохранить качество.
Показать ещё 1 комментарий
0
  • byte[] ba = new byte[is.available()]; Не так вы получите необходимые байты. Самый простой способ получить эти байты - использовать общие ресурсы Apache (IOUtils). Ваш второй подход декодирует растровое изображение непосредственно из входного потока HTTP. Это также возможно, но лучше сначала загрузить его и декодировать. Также вам не нужно сжимать растровое изображение после декодирования. Просто используйте его.
  • Растровое изображение должно быть переработано, если оно не используется. Я не думаю, что вы можете вызвать bitmapFromByteArray.recycle(); из того места, где вы это делаете.
  • 0
    «Растровое изображение должно быть переработано, когда оно не используется. Я не думаю, что вы можете вызвать bitmapFromByteArray.recycle (); из этого места вы делаете это». Вы правы, я понятия не имею, почему я здесь это делаю. У меня нет такого в моем приложении.

Ещё вопросы

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