高效地加载图片(一) 高效地加载大图
1.Read Bitmap Dimensions and Type 讀取圖片的尺寸和類型
//創(chuàng)建一個Options,用于保存圖片的參數(shù) BitmapFactory.Options options = new BitmapFactory.Options(); //設(shè)置是否只讀取圖片的參數(shù)信息 options.inJustDecodeBounds = true; //由于inJustDecodeBounds被設(shè)置為了true,此處只會獲得圖片的參數(shù)信息 //而不會讀取到Bitmap對象,也就不會占用內(nèi)存 BitmapFactory.decodeResource(getResources(), R.id.myimage, options); //獲得圖片的寬高以及類型 int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType;為了避免java.lang.OutOfMemory異常,在將一張圖片解析為Bitmap對象之前,一定要檢查它的尺寸.
2.Load a Scaled Down Version into Memory 加載經(jīng)過縮放的圖片到內(nèi)存中
既然我們已經(jīng)知道了圖片的尺寸,我們就知道是否有必要將原圖加載到內(nèi)存中.我們可以有選擇的將圖片經(jīng)過縮放后再加載到內(nèi)存中.
需要考慮的因素有以下幾點:
1.預(yù)估加載原圖需要的內(nèi)存大小
2.你愿意給這張圖片分配的內(nèi)存大小
3.要顯示這張圖片的控件的尺寸大小
4.手機屏幕的大小以及當(dāng)前設(shè)備的屏幕密度
舉例說明,如果你想要顯示一張128×96像素的縮略圖,則加載一張1024×768像素的圖片是沒有必要的.
為了告訴解碼器去加載一張經(jīng)過縮放的圖片,需要設(shè)置BitmapFactory.Options的inSampleSize參數(shù).
例如:一張圖片的原始大小是2048×1536,如果將inSampleSize設(shè)置為4,則此時加載的圖片大小為512×384,加載經(jīng)過縮放后的圖片只需要0.75MB的內(nèi)存控件而不是加載全圖時需要的12MB.
以下是一個計算inSampleSize的方法:
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {// Raw height and width of image// 圖片的原始寬高final int height = options.outHeight;final int width = options.outWidth;// 默認縮放比例為1int inSampleSize = 1;// 如果原始寬高其中之一大于指定的寬高,則需要計算縮放比例// 否則,直接使用原圖if (height > reqHeight || width > reqWidth) {// 將圖片縮小到一半final int halfHeight = height / 2;final int halfWidth = width / 2;// Calculate the largest inSampleSize value that is a power of 2 and keeps both// height and width larger than the requested height and width.// 計算inSampleSize的值,該值是2的次方,并且能夠保證圖片的寬高大于指定的寬高while ((halfHeight / inSampleSize) > reqHeight&& (halfWidth / inSampleSize) > reqWidth) {inSampleSize *= 2;}}return inSampleSize; }要想使用上述方法,首先要講inJustDecodeBounds設(shè)置為true,讀取到圖片的尺寸信息,再經(jīng)過計算得到的inSampleSize去解析圖片
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,int reqWidth, int reqHeight) {// First decode with inJustDecodeBounds=true to check dimensions// 此處將inJustDecodeBounds設(shè)置為true,則只解析圖片的尺寸等信息,而不生成Bitmapfinal BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeResource(res, resId, options);// Calculate inSampleSize// 此處計算需要的縮放值inSampleSizeoptions.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);// Decode bitmap with inSampleSize set//將inJustDecodeBounds設(shè)置為false,以便于解析圖片生成Bitmapoptions.inJustDecodeBounds = false;return BitmapFactory.decodeResource(res, resId, options); }?
轉(zhuǎn)載于:https://www.cnblogs.com/chenchong/p/3692554.html
總結(jié)
以上是生活随笔為你收集整理的高效地加载图片(一) 高效地加载大图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: APPStore 审核收集
- 下一篇: WINCC中使用ADO对象连接数据库 例