關於設定圖片時,記憶體溢位的解決方法
阿新 • • 發佈:2019-02-13
不知道大家在使用ImageView的setImageBitmap方法時,有沒有遇到過一旦給ImageView設定比較大的圖片,就會導致記憶體溢位這樣的問題。希望我所用的方法在一定程度上可以幫助大家~~
廢話不多說,開始搞事情~~
/** * 通過圖片路徑讀取圖片並通過對圖片進行處理,從而減小圖片的記憶體體積,避免記憶體溢位 * @param imgpath 需要處理的圖片路徑 * @param w 欲設定的寬度 * @param h 欲設定的高度 */ public static Bitmap loadBitmap(String imgpath, int w, int h) { BitmapFactory.Options opts = new BitmapFactory.Options(); //將option的injustDecodeBounds設為true時,解碼bitmap時可以只返回它的寬、高和MIME型別,而不必為其申請記憶體,從而節省了記憶體空間。 opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(imgpath, opts); //獲取原圖片的寬 int srcWidth = opts.outWidth; //獲取原圖片的高 int srcHeight = opts.outHeight; int destWidth = 0; int destHeight = 0; //縮放比例 double ratio = 0.0; //原圖的寬高其中一個小於預設值時,則選用原圖的寬高 if (srcWidth < w || srcHeight < h) { ratio = 0.0; destWidth = srcWidth; destHeight = srcHeight; } else if (srcWidth > srcHeight) { //原圖的寬高都大於預設的寬高且寬的值比高的值要大,則選用寬的縮放比率 ratio = (double) srcWidth / w; destWidth = w; destHeight = (int) (srcHeight / ratio); } else { //原圖的寬高都大於預設的寬高且高的值比寬的值要大,則選用高的縮放比率 ratio = (double) srcHeight / h; destHeight = h; destWidth = (int) (srcWidth / ratio); } //建立一個新的Options BitmapFactory.Options newOpts = new BitmapFactory.Options(); //對圖片的取樣點進行隔行抽取,以減少圖片的記憶體 newOpts.inSampleSize = (int) ratio + 1; newOpts.inJustDecodeBounds = false; newOpts.outHeight = destHeight; newOpts.outWidth = destWidth; 通過新的配置好的options進行圖片的解析 Bitmap tempBitmap = BitmapFactory.decodeFile(imgpath, newOpts); return tempBitmap; }
在此,對於inSampleSize進行說明一下:
對大圖進行降取樣,以減小記憶體佔用。因為直接從點陣中隔行抽取最有效率,所以為了兼顧效率, inSampleSize 這個屬性只認2的整數倍為有效.
比如你將 inSampleSize 賦值為2,那就是每隔2行採1行,每隔2列採一列,那你解析出的圖片就是原圖大小的1/4.
這個值也可以填寫非2的倍數,非2的倍數會被四捨五入.