2016-04-23 106 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

「縮略圖」和「全屏圖像」在我看來似乎是相互衝突的概念。如果你想填滿屏幕,那聽起來不像是一個縮略圖。無論如何,你是否有特定的絕對要求,下載的圖像必須完全是原始像素屏幕的大小?如果有人說明了這個要求,那麼你可能想要考慮放鬆一下,這樣你可以從更合理的角度來看待這個問題。 –