Предотвращение слишком большого растрового изображения для загрузки в текстуру Android

Мне нужно вывести исходное изображение на весь экран в виде галереи. Для большого пальца это будет работать отлично, и когда я попытаюсь отобразить это изображение в полноэкранном режиме с исходным источником, оно не сможет отобразиться. В большинстве случаев, если разрешение изображения больше 2000, будет отображаться ошибка растровое изображение слишком велико для загрузки в текстуру android.

Я хочу предотвратить это, у меня есть поиск в Google, но я не получаю ответа по этому поводу.


person Pratik    schedule 25.03.2014    source источник


Ответы (6)


Я столкнулся с той же проблемой и нашел решение для этой проблемы здесь:

Picasso.with(context).load(new File(path/to/File)).fit().centerCrop().into(imageView);
person Phileo99    schedule 21.03.2015
comment
Спасибо, я уже использовал Picasso, так что это было легко исправить. - person Saragis; 07.11.2015
comment
@Saragis, пожалуйста, рад, что смог помочь. Вы также можете поблагодарить меня, проголосовав за мой ответ - person Phileo99; 07.11.2015
comment
Как вы думаете, почему это решает проблемы с памятью? fit() и resize() не препятствуют загрузке слишком большого изображения. Они просто меняют размер изображения за вас. - person Choletski; 27.04.2018

Я только что создал функцию if else, чтобы проверить, превышает ли изображение размер 1 Мпикс, вот пример кода:

public void onActivityResult(int requestCode, int resultCode, Intent data) {

   if (resultCode == RESULT_OK) {

     if (requestCode == SELECT_PICTURE) {

        Uri selectedImageUri = data.getData();
        selectedImagePath = getPath(selectedImageUri);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 4;

        Bitmap bitmap = BitmapFactory.decodeFile(selectedImagePath);
        int height = bitmap.getHeight(), width = bitmap.getWidth();

        if (height > 1280 && width > 960){
            Bitmap imgbitmap = BitmapFactory.decodeFile(selectedImagePath, options);
            imageView.setImageBitmap(imgbitmap);

            System.out.println("Need to resize");

        }else {
            imageView.setImageBitmap(bitmap);
            System.out.println("WORKS");
        }
person Gilbert92    schedule 09.06.2014

Google предоставил обучение, как это сделать. Загрузите образец со страницы Эффективное отображение растровых изображений

Взгляните на класс ImageResizer. ImageResizer.decodeSampledBitmapFrom * используйте этот метод для получения уменьшенного изображения.

person Minas    schedule 25.03.2014
comment
нигде не вижу этого ImageResizer - person Boy; 31.03.2015
comment
@ Мальчик, вы загрузили образец из раздела «Эффективное отображение растровых изображений»? - person Minas; 31.03.2015
comment
com.example.android.displayingbitmaps.util.ImageResizer - person Minas; 31.03.2015
comment
извините, не скачал образец, просто искал imageResizer на странице. Невозможно отменить -1, если вы не отредактируете свой текущий вопрос. Простите за это - person Boy; 31.03.2015
comment
@Boy только что отредактировал мой ответ, чтобы было ясно, что сначала вам нужно скачать образец :) - person Minas; 31.03.2015

Это код, который я использовал, чтобы исправить мою проблему с подгонкой изображения размером 3120x4196 к просмотру изображения с разрешением 4096x4096. Здесь ImageViewId - это идентификатор представления изображения, созданного в основном макете, а ImageFileLocation - это путь к изображению, размер которого необходимо изменить.

        ImageView imageView=(ImageView)findViewById(R.id.ImageViewId);          
        Bitmap d=BitmapFactory.decodeFile(ImageFileLcation);
        int newHeight = (int) ( d.getHeight() * (512.0 / d.getWidth()) );
        Bitmap putImage = Bitmap.createScaledBitmap(d, 512, newHeight, true);
        imageView.setImageBitmap(putImage);
person Kartik Nigam    schedule 27.06.2016

Вам не нужно загружать все изображение, потому что оно слишком велико и, вероятно, ваш телефон не сможет отобразить все пиксели растрового изображения. Сначала вам нужно масштабировать его в соответствии с размером экрана вашего устройства. Это лучший метод, который я нашел, и он работает очень хорошо: Android: преобразовать размер большого файла растрового изображения в масштабированный выходной файл

person shem    schedule 25.03.2014

Я нашел способ сделать это без использования каких-либо внешних библиотек:

if (bitmap.getHeight() > GL10.GL_MAX_TEXTURE_SIZE) {

    // this is the case when the bitmap fails to load
    float aspect_ratio = ((float)bitmap.getHeight())/((float)bitmap.getWidth());
    Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0,
                    (int) ((GL10.GL_MAX_TEXTURE_SIZE*0.9)*aspect_ratio),
                    (int) (GL10.GL_MAX_TEXTURE_SIZE*0.9));
    imageView.setImageBitmap(scaledBitmap);
}
else{

    // for bitmaps with dimensions that lie within the limits, load the image normally
    if (Build.VERSION.SDK_INT >= 16) {
        BitmapDrawable ob = new BitmapDrawable(getResources(), bitmap);
        imageView.setBackground(ob);
    } else {
        imageView.setImageBitmap(bitmap);
    }
}

По сути, максимальные размеры изображения устанавливаются системой. Вышеупомянутый подход правильно изменит размер растровых изображений, которые превышают этот предел. Однако будет загружена только часть всего изображения. Чтобы изменить отображаемый регион, вы можете изменить параметры x и y метода createBitmap().

Такой подход позволяет обрабатывать растровые изображения любого размера, в том числе снимки, сделанные профессиональными камерами.

Ссылки:

Универсальный загрузчик изображений Android.

person Y.S    schedule 31.12.2015
comment
Подскажите, пожалуйста, как поступить, когда bitmap.getWidth () ›GL10.GL_MAX_TEXTURE_SIZE? - person Othmane; 14.09.2016