很難爲你的應用程序獲得正確的圖像縮放嗎?是你的圖片過大,形成內存問題?仍是圖片不正確縮放形成不良用戶體驗的結果?爲了尋求一個好的解決方案,咱們諮詢了Andreas Agvard(索尼愛立信軟件部門),讓他分享一些關於這方面的經驗。 css
注意:本文沒有完整顯示出代碼示例。你能夠下載本文的PDF,來看完整的代碼示例。 android
在索尼愛立信軟件部門工做,我常常遇到須要圖片縮放的應用,例如:當處理別人或者網絡上提供的圖片。縮放是必要的,由於一般狀況下的圖片不是你想要呈現的那樣。 網絡
典型的例子,若是你正在爲你的應用開發一個LiveView™擴展。大多數人開發應用利用LiveView™和其餘第二屏幕設備,可能須要從新調整圖片,重要的是要保持適當的縮放比例和圖像質量。固然,在不少狀況下,改變圖片尺寸是一個有點困難,可是頗有效的途徑。 性能
ImageView解決了許多的圖片縮放問題,首先,至少你在設置完一個圖片源後,不用去解碼或縮放圖片。但有時須要你本身去解碼控制,這是本教程的用武之地。隨着本教程,我寫了一個代碼示例,下載圖片縮放代碼示例。在文本中呈現的效果,能夠經過編譯和運行該項目來看到。 spa
孤立的問題
我作這個教程,是由於我已經有一些實用方法來實現圖片的縮放,爲了不最多見的圖片縮放問題。以下面的例子: .net
1 |
Bitmap unscaledBitmap = BitmapFactory.decodeResource(getResources(), mSourceId); |
2 |
Bitmap scaledBitmap = Bitmap.createScaledBitmap(unscaledBitmap, wantedWidth, wantedHeight, true ); |
那麼在上面的代碼中,什麼是正確的,什麼是錯的?讓咱們來看看在不一樣的代碼行。 code
行1:整個源圖像解碼到一個位圖。 orm
行2:解碼的位圖縮放到想要的大小。 blog
左邊的圖片:原始圖像。右邊的圖片:縮放後圖片。能夠看出明顯的失真問題,如原圖的眼睛很是的鮮明,縮放後就沒有了。高度出現拉伸。 教程
建立一個解決方案
咱們的解決方案,將有一個結構相似上述代碼,其中的一部分將取代行1,這樣爲縮放作準備。另外一部分將取代行2,作最後的縮放。咱們將開始替換行2的部分代碼,引入兩個新的概念,裁剪和合適。
替換行2
在這一部分,咱們將縮放位圖到咱們所須要的。這一步很必要,由於以前的解碼能力是有限的。此外,在這一步爲了不拉伸,咱們可能要從新調整圖片到想要的大小。
有兩種可能性能夠避免拉伸。不論是那種,咱們都要調整尺寸,以確保他們有相同的寬高比;即縮放圖像做爲源圖像,直到它適合想要的尺寸,或裁剪具備相同的寬高比的源圖像爲想要的尺寸。
左邊的圖片:圖像經過fit方法縮放。圖片已被縮小到適合的尺寸和高度,結果是小於想要的高度。右邊的圖像:圖像crop方法縮放。圖像已被縮放到適應至少想要的尺寸。所以原圖已被裁剪,切割了成左邊和右邊二部分。
爲了縮放這樣的效果,咱們的實現代碼以下: