Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)
在多媒體應用中,位圖無處不在,但是如果加載到內存中的圖片尺寸大于屏幕上要顯示的圖片尺寸時,這些高分辨率的圖片便會引發許多性能問題。為了減輕應用的內存壓力,必須要調整加載到內存中的位圖大小。
需要想辦法讓圖片以實際要顯示的尺寸大小載入內存,而不是以完整的高分辨率進行加載。如果用戶想要查看完整分辨率的圖片,可以根據需要顯示圖片并加載到內存中。
?這里要用到Android中的縮放位圖(Scaling Bitmap)方法.
可以使用如下方法創建一個特定尺寸大小的Bitmap:
但是有一個缺點,此方法需要先要有一個位圖才能使用,也就是說,系統必須先加載圖片、解碼并創建位圖然后才能創建新的特定的尺寸更小的位圖。
1》可以在加載位圖時調整Bitmap的尺寸大小,這時就要用到BitmapOption對象的inSampleSize屬性了。
public int?inSampleSize
Added in?API level 1If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory. The sample size is the number of pixels in either dimension that correspond to a single pixel in the decoded bitmap. For example, inSampleSize == 4 returns an image that is 1/4 the width/height of the original, and 1/16 the number of pixels. Any value <= 1 is treated the same as 1. Note: the decoder uses a final value based on powers of 2, any other value will be rounded down to the nearest power of 2.(當inSampleSize的值不是2的多少次方時,就取比它小的、最接近的2的次方數)
2》但是如果你希望指定的圖片綻放尺寸不是2的次方時,你需要用到以下方法:
從上面bitmapfactory.cpp實現中可以看出,當設置inScaled 標記后,系統會用目標密度除以當前密度,計算出位圖要應用的縮放值。使用這種方法不僅可以調整圖片尺寸,還可以為其應用調整尺寸的濾鏡,也就是在調整尺寸的過程中加入一些額外的運算以使最后呈現的效果更加出色。但是額外應用濾鏡會增加處理時間 ,對于大型圖片而言,這會放緩圖片尺寸的調整速度。
3>解決方案:將以上兩種方法結合起來使用。
?(1)首先將inSampleSize應用到圖片,將圖片調整為目標尺寸的1/4(長、寬各1/4).
(2)然后使用inDensity 和inTargetDensity縮放圖片,以使圖片尺寸完全符合你想要的尺寸。
由于inSampleSize會減少像素數量,并在隨后的密度處理過程中為圖片應用調整尺寸的濾鏡,因此結合這兩種方法可以提高處理速度。
4> 如何獲取圖片的原始尺寸?
總結
以上是生活随笔為你收集整理的Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 那些你所不知道的Bitm
- 下一篇: RecyclerView用法--展示多种