安卓中關於圖片從網絡獲取,壓縮,上傳,下載,縮略圖,緩存的一些處理總結(三)

本帖原創,轉發請標記出處。實在是本人一些膚淺的經驗之談,大神可繞行。另外如有不足之處或者可以優化的地方

歡迎指出,萬分感謝。只爲相互學習和進步。如果能對您有所幫助或者啓發,便是我最開心的事。


第三部分:圖片的內存溢出

上次說完 圖片的壓縮和縮略圖 這次主要說 圖片顯示的時候 內存溢出的問題


顯示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;
}
在此只拋磚引玉,簡略介紹思路,因爲圖像處理內容繁雜,希望各位能有所啓發,找到研究的方向。然後再深入的去了解。早日解決遇到的問題。後續也會繼續補充關於圖像的帖子。

發佈了30 篇原創文章 · 獲贊 36 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章