Android загружает большие изображения из внешнего хранилища

#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-обоев, чтобы просмотреть их.

Android сохраняет и загружает загружаемый файл локально