【譯】圖片尺寸重調整,縮放與自適應

使用resize(x, y)對調整圖像大小

一般的情況下,如果你的服務器或者API能夠按需提供精確尺寸的圖像,并且能夠在帶寬,內存消耗和圖像質量之間做出完美的權衡,那簡直不能更幸運了。

不幸的是,對圖像尺寸的要求,不可能完全受控制。如果圖像的尺寸很怪異,可以使用.resize(horizontalSize, verticalSize)來改變圖像的大小到一個合適的尺寸。它會在展示到ImageView上之前重新調整尺寸的大小。

Picasso
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .resize(600, 200) // resizes the image to these dimensions (in pixel). does not respect aspect ratio
    .into(imageViewResize);

scaleDown()的運用

當使用resize()選項時,Picasso可能會放大你的圖像。如果不改善圖像質量,而僅僅是將小圖放大,是非常浪費計算時間的,可以使用.onlyScaleDown()只對那些當原始圖像尺寸大于目標控件尺寸的用例中,這種情況下,Picasso才會對圖像進行尺寸重調整。

   Picasso
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .resize(6000, 2000)
    .onlyScaleDown() // the image will only be resized if it's bigger than 6000x2000 pixels.
    .into(imageViewResizeScaleDown);

避免圖像縮放后拉伸變形

現在,對于任何圖像處理來講,調整圖片大小都會扭曲縱橫比,丑化圖像的顯示。絕大多數情況下,你都不希望這類事情的發生。Picasso提供了兩套緩解方案,要么調用.centerCrop(),要么調用.centerInside()

CenterCrop

CenterCrop()屬于裁剪技術的一種,它允許圖像縮放,以便能夠充滿目標ImageView的邊界,并裁剪多余的部分。ImageView將會被完全充滿,但是對于圖片自身來講,可能不會被完整的展示出來。

Picasso
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .resize(600, 200) // resizes the image to these dimensions (in pixel)
    .centerCrop() 
    .into(imageViewResizeCenterCrop);

CenterInside

CenterInside()屬于另一種裁剪技術,同樣會縮放圖像,以便縮放后的圖像尺寸等于或小于目標ImageView的邊界。圖像將會完整展示,但不能保證圖像能夠填滿整個ImageView邊界。

Picasso
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .resize(600, 200)
    .centerInside() 
    .into(imageViewResizeCenterInside);

最后,但并非最不重要的:Picasso的fit()

我們剛剛所討論過的那些選項,基本能夠滿足你在尺寸調整和縮放時要求。在這方面,Picasso還有最后一個非常有用的函數,fit()

Picasso
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .fit()
    // call .centerInside() or .centerCrop() to avoid a stretched image
    .into(imageViewFit);

fit()將測量目標ImageView的尺寸,并且在內部實現中調用resize(),用來將圖像尺寸適配至目標ImageView的大小。關于fit()有兩件事需要了解。第一,因為Picasso需要等待目標ImageView的測量完成,所以fit()可能會延遲加載圖像。第二,使用fit()的前提條件是:只能是ImageView作為加載的target(我們將會在隨后介紹其他target)。

在不影響圖像質量的前提下,應該盡量降低圖像的分辨率。因為低分辨率意味著更少的數據被緩存。這能夠顯著降低因圖片占用而對App性能所造成的影響。概括來說,如果你更傾向于通過降低內存占用來達到快速加載的目的,fit()是個不錯的選擇。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容