通常,如果我们提供不同密度的图像(sdpi,mdpi,hdpi,xhdpi等),效果会更好。如果我使用某种库(Picasso,Glide,Volley等)从服务器检索它,我是否需要提供相同的东西?或者我应该只提供原始图像,并且库将其转换为适当的大小和密度我的应用程序?
注意:如果我提供不同大小或密度的图片,我就不会检索所有图片。我只是检索所有图像网址,只需下载一次。这种方式更好,还是提供一个原始图像网址并检索它并将其重新调整到合适的大小更好?
答案 0 :(得分:2)
这取决于目的。例如,如果您只需要显示如下的小型个人资料图片:
您需要在服务器端只有小图像,这将减少内存使用,网络使用和显示图片的时间。
大图像的另一种情况。 例如:
此处显示音乐专辑和图像必须具有高分辨率。
如果您的服务器上有两种类型的图像,一种小图像和一种大图像,那么更好,而且根据情况可以接收图像。
不要担心硬盘上的大小,这将使ImageLoaders控制自己。 图像大小对内存使用和网络使用的影响。
答案 1 :(得分:1)
下载不同尺寸绝对是一种很好的做法。去年的Google I / O 2014应用wrote a post on exactly this topic。
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 page on bucketing sizes。
答案 2 :(得分:0)
将它们分成几种尺寸是个好主意。如果仅以实际显示的大小传输图像,则将减少需要从服务器传输的数据量以及处理一些OOM错误。如果你担心硬盘上的大小,你可以在发送流之前在服务器上缩小一个原始图像。
答案 3 :(得分:0)
没有确定的答案。这些库将调整您的图像大小没有问题(和Bojan的帖子中提到的OOM错误
<强> BUT 强>
整个事情就是图像质量。如果在运行时缩放,则预缩放可能更糟。因此,如果您关心它将如何(并且您应该),那么提供不同的dpi图像
答案 4 :(得分:0)
我认为唯一的问题是图像下载性能。如果您下载的图像大于图像视图,则图像将被调整大小,但您将使用比较小图像下载所需的数据更多的数据。如果您要下载较小的图像,您将使用较少的数据,但图像质量会很低。