歡迎指出,萬分感謝。只爲相互學習和進步。如果能對您有所幫助或者啓發,便是我最開心的事。
第三部分:圖片的內存溢出
上次說完 圖片的壓縮和縮略圖 這次主要說 圖片顯示的時候 內存溢出的問題
顯示Bitmap之前 會經常遇到一些內存溢出的情況 這是因爲imageView調用一些顯示方法的時候 佔用的內存過多 不是說 一張壓縮後20K的圖片 就一定佔用的內存小。 所以在顯示尺寸大的R.drawable.XXX的時候可調用下面方法
/** * 大圖片處理機制 * 利用Bitmap 轉存 R圖片 */ public static Bitmap btp; public static void getBitmapForImgResourse(Context mContext, int imgId, ImageView mImageView) throws IOException { InputStream is = mContext.getResources().openRawResource(imgId); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = false; options.inPreferredConfig = Bitmap.Config.RGB_565; options.inPurgeable = true; options.inInputShareable = true; options.inSampleSize = 1; btp = BitmapFactory.decodeStream(is, null, options); mImageView.setImageBitmap(btp); // btp.recycle(); is.close(); }
說明option中的一些方法
public Bitmap revitionImageSize(String path) throws IOException { InputStream is = new FileInputStream(path); BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(path))); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; //2.爲位圖設置10K的緩存 options.inTempStorage = new byte[10*1024]; //3.設置位圖顏色顯示優化方式 options.inPreferredConfig = Bitmap.Config.RGB_565; //4.設置圖片可以被回收,創建Bitmap用於存儲Pixel的內存空間在系統內存不足時可以被回收 options.inPurgeable = true; //6.設置解碼位圖的尺寸信息 options.inInputShareable = true; //5.設置位圖縮放比例 options.inSampleSize = 4; BitmapFactory.decodeStream(in, null, options); in.close(); int i = 0; Bitmap bitmap = null; while (true) { if ((options.outWidth >> i <= 256) && (options.outHeight >> i <= 256)) { in = new BufferedInputStream( new FileInputStream(new File(path))); options.inSampleSize = (int) Math.pow(2.0D, i); options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeStream(in, null, options); break; } i += 1; } return bitmap; }在此只拋磚引玉,簡略介紹思路,因爲圖像處理內容繁雜,希望各位能有所啓發,找到研究的方向。然後再深入的去了解。早日解決遇到的問題。後續也會繼續補充關於圖像的帖子。