Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Picasso.with(context).load(new File(path/to/File)).fit().centerCrop().into(imageView);

Ответ 2

Я только что создал функцию 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");
        }

Ответ 4

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

Ответ 5

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

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.

Ответ 6

Это код, который я использовал для исправления моей проблемы с установкой изображения с разрешением 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);