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-изображение.
Есть ли способ получить первый метод?
Спасибо.
Вы пытаетесь просто скопировать содержимое 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
, чтобы избежать выделения массива вверх, но вам не нужно беспокоиться об этом.
byte[] ba = new byte[is.available()];
Не так вы получите необходимые байты. Самый простой способ получить эти байты - использовать общие ресурсы Apache (IOUtils). Ваш второй подход декодирует растровое изображение непосредственно из входного потока HTTP. Это также возможно, но лучше сначала загрузить его и декодировать. Также вам не нужно сжимать растровое изображение после декодирования. Просто используйте его.bitmapFromByteArray.recycle();
из того места, где вы это делаете.