聽說這個會一直轉,一直轉,一直轉。
在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在內存最大使用的權限。
沒有留言:
張貼留言
你好,我是小書,如果文章內容有錯誤,或是看到有建議以及任何感想時,歡迎提出分享,我們一起學習一起努力。