Ⅰ android性能優化(八)--Android圖片內存優化
2個基本原則
既然需要的內存公式已得到,那優化就顯而易見了,無非就是減小的這三個參數的值,具體的策略如下:
這里我們將圖片分為2種情況來探討:
圖片佔用的內存 大小為:
為什麼mipmap不在這種情況的考慮范圍之內呢?
因為mipmap是Android系統為了避免Launcher Icon變形而添加的資源目錄,也就是說,mipmap中的圖片不會被縮放。所以Google也不推薦將除Launcher Icon之外的圖片放在mipmap目錄中。
本地圖片通常都是通過Android提供的BitmapFactory來載入的, 這里看幾個常用的API:
圖片的優化可通過Options參數來實現(Options的介紹可參考 從fresco 看圖片優化 :
inPreferredConfig的取值為Bitmap.Config類型(這里只考慮以下幾種情況),它是一個枚舉類型,用來設置每個像素需要的位元組數:
1.jpeg和gif
2.webp
3.png8, png24, png32
網路圖片通常我們都是使用開源庫進行載入, 所以不需要拿到Bitmap再進行縮放或裁剪。
這時可讓後台實現網路圖片的裁剪,即:根據圖片的請求參數返回合適的尺寸,最大也只需要控制項的大小即可。
再大也沒意義,不僅浪費流量,還佔用內存。
如果你的APP中有很多圖片,那麼可對圖片的寬高根據設備的內存情況進行適當的縮小:
盡量為所有解析度創建資源 資源匹配解析度 = 減少不必要的縮放,從而提高UI繪制效率
對於一個多圖片的APP來說,圖片所佔內存的優化是一項必不可少的工作。
總的來說,其優化也就是通過 縮放 和指定 Bitmap.Config的值 來實現的,只是不同位置,不同格式的圖片有所差異而已。
https://juejin.im/post/5af84f4b51882542714fdaa9?utm_medium=an&utm_source=weixinqun
Ⅱ Android 圖片載入(一)高效載入Bitmap 基礎篇
由於Bitmap的特殊性以及Android對單個應用所規定的最大內存限制,我們在同時載入大量Bitmap時很容易發生內存溢出,即我們通常所說的OutOfMemoryError(OOM),因此高效載入Bitmap就成為了每個Android開發者的必備技能。
在學習如何高效地載入Bitmap之前,首先介紹一下如何載入一個Bitmap。我們都知道,Bitmap在Android中通常指的是一張圖片,那麼如何將JPG、PNG等格式的圖片轉換成Bitmap對象呢?BitmapFactory類給我們提供了一些方法:
接下來開始介紹如何高效地載入Bitmap,其實核心思想很簡單: 就是採用BitmapFactory.Options參數來調整圖片尺寸來適配控制項的大小。
假如我們顯示圖片的控制項ImageView寬高為100×100像素,而圖片的尺寸為1024×1024像素,這個時候如果將整個圖片載入進來並顯示到控制項上,自然是很佔用內存資源的。這個時候可以通過BitmapFactory.Options按一定的采樣率載入縮小後的圖片,再將縮小後的圖片顯示到ImageView中,這樣就能減小內存佔用從而在一定程度上避免OOM的發生。
通過BitmapFactory.Options來縮放圖片,主要是使用它的inSampleSize參數,也就是前面提到的采樣率。當采樣率inSampleSize為1時,采樣後的圖片大小為原圖大小;當采樣率inSampleSize>1,比如為2時,采樣後的圖片寬高都為原圖的1/2,即像素降為原圖的1/4,佔用的內存大小也就是原圖的1/4;比較特殊的是,當采樣率inSampleSize<1時,系統會自動將該值當做1來處理。 因此可以得出一個結論:采樣率inSampleSize必須是大於1的整數圖片才會有縮小的效果,並且采樣率同時作用於寬高,也就是說采樣後的圖片會縮小到原圖的1/(inSampleSize^2)。比如inSampleSize=4,那麼縮放比例為1/16。
我們現在知道了,通過采樣率可以提高圖片的載入效率,那麼如何才能計算出最合適的采樣率?我們可以按照如下流程:
接下來以decodeFile方法為例實現圖片的縮放,其他三個方法處理方式類似。
下一篇: Android 圖片載入(二)圖片載入框架Glide 入門篇
《Android開發藝術探索》
Ⅲ Android圖片載入及虛化效果
[TOC]
使用如下方式載入圖片
會導致OOM,android對於直接通過資源id載入的資源需做cache,下次再需要此資源的時候直接從cache中得到。但這樣做也造成了用過的資源都會在內存中,這樣的設計不是很適合使用了很多大圖片資源的應用,這樣累積下來應用的內存峰值是很高的。
當使用諸如
imageView.setBackgroundResource
imageView.setImageResource
BitmapFactory.decodeResource
這樣的方法來設置一張大圖片時,在完成decode後,最終都是通過java層的createBitmap來完成的,需要消耗更多內存。因此,改用先通過BitmapFactory.decodeStream方法,創建出一個bitmap,再將其設為ImageView的 source,decodeStream最大的秘密在於其直接調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap,從而節省了java層的空間。如果在讀取時加上圖片的Config參數,可以有效減少載入的內存,從而有效阻止拋OOM異常。
實際使用中,可以針對bitmap做如下操作
RenderScript是Google在API11中引入的類,可看作業android內置的圖片處理框架(區別於Glide等圖片處理框架,RenderScript注重於圖片的處理而不是載入)。RenderScript實際操作基於RenderScript Intrinsics,一些可以幫助RenderScript快速實現各種圖片處理的操作類。該類包含諸多操作功能,比如利用ScriptIntrinsicBlur,就可以簡單高效地實現高斯模糊效果,可通過參數radius設置虛化的程度。
1920*1080的原始圖片未經壓縮讀取時間可能會超過1s,使用該圖片作為背景圖片載入時會有明顯的卡頓。此時就需要設置BitmapFactory.Options實現對待載入圖片的壓縮。可參照 https://blog.csdn.net/u012124438/article/details/66087785 逐步優化Bitmap載入。對於載入圖片較多較頻繁的功能,建議使用第三方的圖片載入框架,如Glide或者Picasso。
需要注意的是,此處doBlur有兩個重載,可根據需要設置圖片的縮放比例.這種方式和前文通過BitmapFactory.Options設置Bitmap取樣格式的效果是一致的,都是為了減小Bitmap載入的資源消耗,提高載入效率。
Ⅳ android 載入大量圖片速度慢是什麼原因,是訪問sd卡慢,還是使用bitmap的時候慢
android 載入大量圖片速度慢原因一般是訪問sd卡慢,SD卡讀取速度較慢造成的載入文件速度慢。
載入,漢語詞語,字面意思是增加裝載量。現多用於計算機相關領域,表示啟動程序時文件或信息的載入。
點陣圖文件(Bitmap),擴展名可以是.bmp或者.dib。點陣圖是Windows標准格式圖形文件,它將圖像定義為由點(像素)組成,每個點可以由多種色彩表示,包括2、4、8、16、24和32位色彩。例如,一幅1024×768解析度的32位真彩圖片,其所佔存儲位元組數為:1024×768×32/8=3072KB
點陣圖文件圖像效果好,但是非壓縮格式的,需要佔用較大存儲空間,不利於在網路上傳送。jpg格式則恰好彌補了點陣圖文件這個缺點。