- 原文鏈接: Image Resizing, Scaling and fit()
- 原文作者: Future Studio
- 譯文出自: 小鄧子的簡書
- 譯者: 小鄧子
- 狀態: 完成
使用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()
是個不錯的選擇。