毕加索 - 在下载前缩小图像以获得更好的性能

3
我有一个图像列表需要从服务器下载并在Android应用程序中的listView中显示。它们的长宽比不同,因为我希望每个ImageView都与设备的宽度匹配,所以我不能固定它们的高度。
我也知道可以通过缩小图片来提高性能,就像Picasso使用fit()和resize()方法一样。
我正在使用Picasso进行我的项目开发。问题是,如果我不知道imageView的高度,我将无法使用Picasso的fit()和resize()方法来缩小图像。
所以我尝试了其他方法。我想知道transform是否也可以对图像进行缩小?
new Transformation() {
                    @Override
                    public Bitmap transform(Bitmap source) {
                        int targetHeight = deviceWidth;
                        double aspectRatio = (double) source.getHeight() / (double) source.getWidth();
                        int targetWidth = (int) (targetHeight / aspectRatio);
                        Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
                        if (result != source) {
                            // Same bitmap is returned if sizes are the same
                            source.recycle();
                        }
                        return result;
                    }

                    @Override
                    public String key() {
                        return "transformation" + " desiredWidth";
                    }

非常感谢。
2个回答

1
你不能在下载之前“缩小图像”。Picasso(以及其他所有东西)按原样下载原始图像,然后根据容器的尺寸进行缩放计算。如果你既不使用fit()也不使用resize(),Picasso将以完整分辨率加载图像:即原始图像的分辨率。

没错。如果你想直接下载一个小图像,你应该考虑另一个服务器来完成下载和缩放图像的“脏活”,然后将其提供给你的应用程序。 - Joaquin Iurchuk
谢谢你纠正我,我没想到那个。那么,当图像首次加载时,我该怎么做才能提高 Picasso 的性能?上述使用 transform 方法的代码有帮助吗?还有什么其他方法可以改善它? - Derekyy
你可以直接调用 fit(),它会根据容器的大小自动调整图像的尺寸。另一方面,如果你在运行时决定容器的大小,你可以调用 resize(width, height) 并结合 centerCrop()centerInside() 中的一个,具体取决于最终结果应该是什么。 - Sebastiano

1
你可以使用Thumbor服务在下载前裁剪和调整图片大小。Square公司为其提供了漂亮的Java客户端Pollexor。还有特殊的Picasso RequestTransformer用于Pollexor。也就是说,你将获得所有预处理的后端提取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接