如果我使用Picasso、Glide或Volley检索图像,是否需要提供不同尺寸的图像?

4
通常情况下,我们最好提供不同密度(sdpi、mdpi、hdpi、xhdpi等)的图像。如果我使用某种库(Picasso、Glide、Volley等)从服务器检索图像,是否需要提供相同的内容,还是只需提供原始图像,库将将其转换为适合我的应用程序的适当大小和密度?
注意:如果我提供具有不同大小或密度的图像,则不会检索所有图像。我只检索所有图像的URL并仅下载其中一张。这样做是否更好,还是提供一个原始图像URL并检索并重新调整其大小到适当的大小更好?
5个回答

2
这取决于目的。例如,如果您只需要显示像这样的小个人资料图片:

Item from friends list

您只需要在服务器端拥有小图像,这将减少内存使用、网络使用和显示图片所需的时间。
另一种情况是大型图片。例如:

Album Picture

这里展示音乐专辑和图片必须具有高分辨率。
最好在服务器上有两种类型的图像,一种小的和一种大的,然后可以根据情况接收图像。
不要担心硬盘驱动器上的大小,这将由ImageLoaders控制自己。 图像大小会影响内存使用和网络使用。

1

下载不同尺寸的图片绝对是良好的实践。去年,Google I/O 2014应用程序在这个主题上写了一篇文章

Glide提供了BaseGlideUrlLoader类,允许您将图像请求分成多种不同的大小,前提是您的后端支持它。

例如,Glide的FlickrModelLoader使用Flickr的API以及您的请求大小仅下载所需的最小图片,节省电池、带宽,并确保请求尽快完成。

BaseGlideUrlLoader的一个简单示例实现可能如下所示:

public class ExampleUrlLoader extends BaseGlideUrlLoader<YourModel> {
    private static final int ORIGINAL_SIZE = -1;


    @Override
    protected String getUrl(YourModel model, int width, int height) {
       int maxSize = Math.max(width, height);
       final int size;
       if (maxSize > 800) {
           size = ORIGINAL_SIZE;
       } else if (maxSize > 400) {
           size = 800;
       } else if (maxSize > 200) {
           size = 400;
       } else if (maxSize > 50) {
           size = 200;
       } else {
           size = 50;
       }
       return model.getBaseUrl() + "&size=" + size;
    }
}

你可以查看Glide的GiphyModelLoader进行另一个示例,和/或Glide的有关分桶大小的wiki页面

0

拥有多个尺寸是个好主意。如果你只传输实际显示大小的图像,你将减少从服务器传输数据的数量,并处理一些OOM错误。如果你担心它会占用硬盘空间,你可以在发送流之前在服务器上缩小一个原始图像。


你的意思是说,在服务器上提供所有尺寸的图像会更好? - Gustaf
是的,这样做更好,但人们往往会避免它,因为这意味着需要完成更多的工作! :) - Bojan Kseneman

0

没有确定的答案。这些库可以轻松调整您的图像大小(并且在Bojan的帖子中提到的OOM错误)。

但是

整个问题在于图像质量。如果在运行时缩放,可能会比预先缩放更糟糕。因此,如果您关心它的外观(我认为您应该关心),请提供不同dpi的图像。


0

我认为唯一的问题是图像下载性能。如果您下载的图像比您的图像视图大,那么该图像将被调整大小,但您将使用比所需更多的数据来下载较小的图像。如果您下载较小的图像,则使用的数据量将较少,但图像质量将较低。


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