#android #image #load
#Android #изображение #загрузка
Вопрос:
Мне нужно загрузить много больших изображений (500 файлов в формате png) с SD-карты в мое приложение. Всегда ли мне нужно конвертировать изображения в растровое изображение и создавать растровые файлы? Я не хочу изменять размер кучи. Есть ли другой способ считывать изображения с SD-карты?
Ответ №1:
Если вы отображаете их в виде, то вам нужно загрузить их в память целиком.
Вы не упомянули, какого размера будут ваши изображения, но то, что мы делаем в нашей фотогалерее, — это сохраняем список SoftReference
этих растровых изображений, чтобы сборщик мусора мог выбросить их, когда они не видны (т. Е. Когда вид, отображающий их, отбрасывается — убедитесь, что это действительно происходит, например, с помощью AdapterView
). Объедините это с отложенной загрузкой этих растровых изображений, и у вас все должно получиться.
Комментарии:
1. На самом деле они не такие большие. Возможно, всего 5 МБ. Но у меня есть viewflipper с imageviews (и некоторыми другими виджетами) в нем. Поэтому я не могу использовать галерею.
2. не уверен, как
ViewFlipper
работает внутренне, но если он не сохраняет сильных ссылок на изображения,Drawable
которые он «переворачивает», тогда все должно быть в порядке.
Ответ №2:
Внутреннее представление изображения в вашем приложении представляет собой набор битов, а не изображение какого-либо определенного формата (png, bmp и т.д.).
Изображение преобразуется в это внутреннее представление при загрузке изображения BitmapFactory.
Обычно не рекомендуется загружать все растровые изображения сразу, у вас быстро закончится память…
Комментарии:
1. Большое спасибо за ответ. вы абсолютно правы, но я должен загрузить все изображения сразу из-за требований.
Ответ №3:
Если размер вашего изображения очень большой, вы должны изменить его размер перед загрузкой в ImageView. В противном случае даже одно изображение может легко вызвать проблему нехватки памяти. Я не знаю, сколько изображений вы хотите отображать одновременно и насколько они велики. Но я предлагаю вам изменить их размер перед отображением.
Чтобы изменить размер изображения и отобразить его, вы можете использовать этот код:
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(fileInputStream, null, bitmapOptions);
//reduce the image size
int imageWidth = bitmapOptions.outWidth;
int imageHeight = bitmapOptions.outHeight;
int scale = 1;
while (imageWidth/scale >= screenWidth amp;amp; imageHeight/scale >= screenHeight) {
imageWidth = imageWidth / 2;
imageHeight = imageHeight / 2;
scale = scale * 2;
}
//decode the image with necessary size
fileInputStream = new FileInputStream(cacheFile);
bitmapOptions.inSampleSize = scale;
bitmapOptions.inJustDecodeBounds = false;
imageBitmap = BitmapFactory.decodeStream(fileInputStream, null, bitmapOptions);
ImageView imageView = (ImageView)this.findViewById(R.id.preview);
imageView.setImageBitmap(imageBitmap);
В моем проекте Android я использую этот фрагмент кода для изменения размера моих HD-обоев, чтобы просмотреть их.