2016-04-23 102 views
0

我正在基于thumbor的动态缩略图服务工作,该服务将为给定图像提供任何大小的缩略图并将其缓存。理想情况下,我想限制缩略图的大小,以便缓存将有效,并且可以预先缓存这些大小的图像。理想情况下,应根据屏幕密度,屏幕大小和网络速度计算预先缓存的不同类型的图像大小,以便android会请求适当大小的图像。基于屏幕大小和密度的Android动态缩略图大小

我想知道如何计算预先缓存的图像的多个维度,以及如何决定在Android上获取哪个大小的图像。

蛮力的方法是不限制图像的大小,只是要求像素的宽度等于屏幕宽度,但会浪费缓存,因为即使两个设备的屏幕宽度的细微差异将需要不同大小的图像缓存。

根据此url中的屏幕配置图,我可以缓存图中指定的所有宽度的图像。在运行时,我可以计算的行和列在该排行榜当前设备千篇一律基于这些链接Get screen sizeGet screen dpi

回答

1

您可以使用毕加索或滑翔你的目的,他们处理调整大小和该库自动处理图像的高速缓存。例如,对于尺寸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); 

一点需要注意的是,虽然这两个库并调整图像大小,但缓存是不同的: -

无论大小是,毕加索将只缓存单幅图像,全尺寸图像。

滑动行为不同,缓存每个大小的ImageView的 单独的文件。虽然图像已经加载一次 ,但是如果您需要加载另一个尺寸的图像,则需要再次下载 ,然后才能将其调整为正确的分辨率,然后再缓存 。

因此,对于您的使用情况下,我会建议你使用Glidemore about Glide vs Picasso

+0

我已经在使用滑翔。但是它仍然需要对全尺寸图像进行网络请求,这是我想要避免的。同时显示第一次图像时,获取填充大小图像也需要时间,因此图像加载速度较慢。 – pratsJ

+0

另外我正在讨论服务器端缓存而不是android端 – pratsJ

1

两件事情将帮助您:

  1. 定义的高度和你的ImageView的宽度将包含作为尺寸资源的缩略图
  2. 当需要确定要提取的图像的尺寸时,将这些尺寸资源转换为像素值

因此,举例来说,如果您使用的是ImageView的显示尺寸64×64 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); 

现在您可以使用高度和宽度来告诉动态缩略图服务如何创建最适合手头设备的缩略图图像。

+0

大多数图像是填充宽度图像,因此图像宽度等于屏幕宽度。但是由于Android中存在太多的设备碎片,我的缩略图服务缓存将需要存储所有可能宽度的图像,因为在最坏的情况下没有android设备,这是我想要避免的,因此创建了具有一些固定宽度的存储桶并且在运行时我可以计算出我当前设备中哪些存储桶适合并可以索要该大小的缩略图。 – pratsJ

+0

因此,需要一个好的算法来根据屏幕密度和大小决定可能的存储宽度和运行时间计算哪个存储桶当前设备落入 – pratsJ

+0

“缩略图”和“全屏图像”在我看来似乎是相互冲突的概念。如果你想填满屏幕,那听起来不像是一个缩略图。无论如何,你是否有特定的绝对要求,下载的图像必须完全是原始像素屏幕的大小?如果有人说明了这个要求,那么你可能想要考虑放松一下,这样你可以从更合理的角度来看待这个问题。 –