Как эффективно загружать большие растровые изображения с помощью Picasso?

Я разрабатываю приложение для обоев, в котором я показываю изображения с помощью firebase и Picasso в GridView. Я хочу получить изображение с сервера и изменить его размер в соответствии с разрешением экрана. Пусть размер изображения 3000*5000 и размер экрана устройства 720*1280, тогда изображение обрезается до 720*1280.

https://developer.android.com/topic/performance/graphics/load-bitmap дает решение, но оно изменило размер файла для рисования и с фиксированным размером.

Но я хочу изменить размер изображения сервера с размером экрана устройства.

RecyclerView ViewHolder

public void setDetails(Context ctx, String image){

        ImageView mImageTv = mView.findViewById(R.id.rImageView);

        Picasso.get().load(image).into(mImageTv);

    }

Передача изображения из Fragment в FullscreenActivity с помощью putExtra

ViewHolder viewHolder = super.onCreateViewHolder(parent, viewType);
                viewHolder.setOnclickListener(new ViewHolder.ClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {

                        ImageView mImageView = view.findViewById(R.id.rImageView);

                        Drawable mDrawable = mImageView.getDrawable();
                        Bitmap mBitmap = ((BitmapDrawable) mDrawable).getBitmap();

                        Intent intent = new Intent(view.getContext(), PostDetailsActivity2.class);
                        ByteArrayOutputStream stream = new ByteArrayOutputStream();

                        mBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                        byte[] bytes = stream.toByteArray();
                        intent.putExtra("image", bytes);
                        startActivity(intent);


                    }

Показать изображение в полноэкранном режиме

mImageTv = findViewById(R.id.full_imageView1);


        byte[] bytes = getIntent().getByteArrayExtra("image");
        Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

        mImageTv.setImageBitmap(bmp);

Пожалуйста, помогите мне, если вы можете .... если кому-то нужна дополнительная информация о коде или о моей проблеме, пожалуйста, прокомментируйте для них .... Спасибо.


person Badal Kumar Satapathy    schedule 23.08.2018    source источник
comment
Я полагаю, что вы хотите здесь загрузить и изменить размер загруженного изображения из Firebase в GridView в качестве миниатюры?   -  person Infinite Loops    schedule 23.08.2018


Ответы (2)


Хорошо, так как вы используете библиотеку Picasso для загрузки ваших изображений, библиотека автоматически обрабатывает кэширование фактического растрового изображения после загрузки изображения. Одна очевидная вещь в вашем коде заключается в том, что вы пытаетесь передать растровое изображение через намерение, что обычно является большим нет-нет, поскольку данные растрового изображения довольно велики и могут привести к огромным затратам производительности. Вместо этого при первом вызове Picasso.get().load(image).into(mImageTv) Picasso фактически сохранит это растровое изображение (эффективным образом) для вас, поэтому при следующем вызове Picasso.get().load(image) изображение уже будет храниться локально в вашем приложении, и вам фактически не придется создавать сеть. позвони снова. Итак, в вашем FullscreenActivity все, что вам нужно сделать, это снова позвонить Picasso.get().load(image).into(mImageTv).

Теперь о правильном отображении изображения. Если изображение вашего сервера имеет размер 3000x5000, а размер экрана вашего устройства 720x1280, и вы хотите отобразить все изображение, вы можете использовать функцию centerCrop, предоставленную Picasso, Picasso.get().load(image).fit().centerCrop().into(mImageTv). Он изменит размер изображения, чтобы он соответствовал всем границам экрана, и гарантирует, что изображение сохранит свое соотношение сторон (поскольку соотношение сторон изображения сервера не совпадает с соотношением сторон экрана устройства).

person crymson    schedule 23.08.2018

Для получения ширины и высоты экрана:

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;

Затем измените размер с помощью скольжения:

GlideApp  
    .with(context)
    .load(url)
    .override(600, 200) // resizes the image to these dimensions (in pixel). resize does not respect aspect ratio
    .into(imageViewResize);
person Erselan Khan    schedule 27.08.2018