2014年7月12日 星期六

android 圖片防止OOM的方法


聽說這個會一直轉,一直轉,一直轉。

在Android之中,該如何獲取照片以防止OOM呢?
我試做了一些處理方法:

主要的原理就是,先抓圖片長寬meta,計算縮放的比例之後,利用BitmapFactory.Options的inSampleSize屬性重新產生一個縮放過的圖片。


            //設置一個圖片長寬的允許最大值
            int MAX_PIC_SIZE=600;
            // 獲取圖片
            Uri selectedImage = data.getData();

            InputStream inputStream = null;
            try {
                //將圖片url用inputStream的格式取回
                inputStream = getActivity().getContentResolver()
                        .openInputStream(selectedImage);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            //產生option實例,獲取meta用途
            BitmapFactory.Options option = new BitmapFactory.Options();
            //先只獲取圖片的meta
            option.inJustDecodeBounds = true;
            Bitmap bitmap = null;
            BitmapFactory.decodeStream(inputStream, null, option);
            int width = option.outWidth;
            int height = option.outHeight;

            int maxValue = (width > height) ? width : height;

            double scale = 1;

            //運算調整的大小
            //TODO 這裡可以做任何計算,讓圖片達到你想要的表現
            if (maxValue > MAX_PIC_SIZE) {
                scale = maxValue / MAX_PIC_SIZE;
            } else {
                //do nothing
            }
            //這次進行縮放
            option = new BitmapFactory.Options();
            option.inSampleSize = (int) scale;// 縮放圖
            try {
                inputStream = getActivity().getContentResolver()
                        .openInputStream(selectedImage);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            //再次產生圖片
            bitmap = BitmapFactory.decodeStream(inputStream, null, option);

             //show 圖片
            ImageView imageView = (ImageView) getView().findViewById(
                    R.id.img_photo);
            imageView.setImageBitmap(bitmap);

關於防止 OOM 的做法,
也可以在 AndroidManifest.xml 的 application 中設置 android:largeHeap="true"
獲取app在內存最大使用的權限。 

沒有留言:

張貼留言

你好,我是小書,如果文章內容有錯誤,或是看到有建議以及任何感想時,歡迎提出分享,我們一起學習一起努力。

追蹤者