如何使用毕加索有效地加载大位图?

时间:2018-08-23 18:04:29

标签: android android-imageview android-image android-bitmap

我正在开发一个Wallpaper应用程序,在该应用程序中,我将通过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);

    }

使用putExtra将图片从Fragment传递到FullscreenActivity

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);

如果可以的话,请帮助我。...如果有人需要更多代码详细信息或有关我的问题,请对此发表评论。...谢谢

2 个答案:

答案 0 :(得分:1)

好的,因为您正在使用Picasso库加载图像,所以一旦加载图像,该库就会自动为您处理实际位图的缓存。代码中的一件明显的事情是,您试图通过一种Intent传递Bitmap,这通常是一个很大的禁忌,因为Bitmap数据相当大,并且会产生巨大的性能成本。取而代之的是,第一次调用Picasso.get().load(image).into(mImageTv)时,毕加索实际上会(以一种有效的方式)为您保存该位图,因此,下次调用Picasso.get().load(image)时,该图像将已经存储在本地应用程序中,实际上不必再次拨打网络电话。因此,在您的FullscreenActivity中,您要做的就是再次致电Picasso.get().load(image).into(mImageTv)

现在以正确的方式显示图像,如果您的服务器图像为3000x5000,设备屏幕尺寸为720x1280,并且要显示整个图像,则可以使用Picasso提供的centerCrop功能,{{ 1}}。它将调整图像的大小以适合屏幕的整个边界,并确保图像保留其长宽比(因为服务器图像的长宽比与设备屏幕的长宽比不匹配)。

答案 1 :(得分:0)

获取屏幕宽度和高度:

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);