我正在开发基于thumbor的动态缩略图服务,该服务将为给定图像提供任何大小的缩略图并将其缓存。理想情况下,我想约束缩略图的大小,以便缓存有效,我可以预先缓存这些大小的图像。理想情况下,应根据屏幕密度,屏幕大小和网络速度计算预先缓存的不同类型的图像大小,以便android将请求合适的大小图像。
我想知道如何计算要预先缓存的图像的多个维度以及如何确定要获得的大小图像。
蛮力的方式是不限制图像大小,只是要求宽度等于屏幕宽度的图像,但是会浪费缓存,因为即使两个设备的屏幕宽度差异很小,也需要缓存不同大小的图像
根据此url中的屏幕配置图,我可以缓存此图表中指定的所有宽度的图像。在运行时,我可以根据这些链接Get screen size计算此图表当前设备中哪一行和哪一行适合, Get screen dpi
答案 0 :(得分:1)
您可以使用Picasso或Glide来处理调整大小,此库会自动处理图像缓存。例如,对于大小为600x200的缩略图: -
Loading and caching thumbnail with Picasso of exact imageView size
Picasso
.with(context)
.load("your_image_your")
.resize(600, 200) // resizes the image to these dimensions (in pixel)
.centerCrop()
.into(imageViewThumbnail);
<强> Loading and caching thumbnail with Glide of exact imageView Size 强>
Glide
.with(context)
.load("your_image_your")
.override(600, 200) // resizes the image to these dimensions (in pixel)
.centerCrop() // this cropping technique scales the image so that it fills the requested bounds and then crops the extra.
.into(imageViewThumbnail);
这里要注意的是,虽然两个库都调整了图像的大小,但缓存是不同的: -
无论大小如何,Picasso都只会缓存单个尺寸的图像,即全尺寸图像。Glide的行为方式不同,缓存单独的文件 每个尺寸的ImageView。虽然图像已经加载一次 但如果你需要加载另一个尺寸的相同图像,它需要 在重新调整到正确的分辨率之前再次下载 然后被缓存。
因此,对于您的使用案例,我建议您使用Glide (more about Glide vs Picasso)
答案 1 :(得分:1)
有两件事可以帮到你:
因此,例如,如果您使用ImageView显示大小为64x64 dp的缩略图,请定义尺寸资源,如下所示:
<dimen name="thumbnail_height">64dp</dimen>
<dimen name="thumbnail_width">64dp</dimen>
在包含ImageView的布局中使用这些值:
<ImageView
....
android:layout_height="@dimen/thumbnail_height"
android:layout_width="@dimen/thumbnail_width"
/>
然后,在运行时,将它们转换为设备的原始像素值:
int height = getResources().getDimensionPixelSize(R.dimen.thumbnail_height);
int width = getResources().getDimensionPixelSize(R.dimen.thumbnail_width);
现在,您可以使用高度和宽度来告诉动态缩略图服务如何创建最适合手头设备的缩略图图像。