BitmapFactory。options. inSampleSize 용법

http://www.cnblogs.com/lost-in-code/archive/2012/04/06/2435325.html
BitmapFactory.decodeFile(imageFile);
비트 맵 팩 토리 로 그림 을 디 코딩 할 때 이 오류 가 발생 할 수 있 습 니 다.이것 은 왕왕 그림 이 너무 커서 생 긴 것 이다.정상적으로 사용 하려 면 더 적은 메모리 공간 을 분배 하여 저장 해 야 한다.
BitmapFactory.Options.inSampleSize
적절 한 inSampleSize 를 설정 하면 BitmapFactory 가 이 오 류 를 없 애기 위해 더 적은 공간 을 분배 할 수 있 습 니 다.inSampleSize 의 구체 적 인 의 미 는 SDK 문 서 를 참고 하 십시오.예 를 들 면:
BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inSampleSize = 4;

Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

적절 한 inSampleSize 를 설정 하 는 것 이 이 문 제 를 해결 하 는 관건 중의 하나 이다.BitmapFactory. Options 는 다른 멤버 인 inJustDecodeBounds 를 제공 합 니 다.
BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inJustDecodeBounds = true;

Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

 
 
inJustDecodeBounds 를 true 로 설정 한 후 decodeFile 은 공간 을 분배 하지 않 지만 원본 그림 의 길이 와 너비, 즉 opts. width 와 opts. height 를 계산 할 수 있 습 니 다.이 두 개의 매개 변수 가 있 고 일정한 알고리즘 을 통 해 적당 한 inSampleSize 를 얻 을 수 있 습 니 다.
Android 소스 코드 를 보면 Android 는 동적 계산 방법 을 제공 합 니 다.
public static int computeSampleSize(BitmapFactory.Options options,

        int minSideLength, int maxNumOfPixels) {

    int initialSize = computeInitialSampleSize(options, minSideLength,

            maxNumOfPixels);



    int roundedSize;

    if (initialSize <= 8) {

        roundedSize = 1;

        while (roundedSize < initialSize) {

            roundedSize <<= 1;

        }

    } else {

        roundedSize = (initialSize + 7) / 8 * 8;

    }



    return roundedSize;

}



private static int computeInitialSampleSize(BitmapFactory.Options options,

        int minSideLength, int maxNumOfPixels) {

    double w = options.outWidth;

    double h = options.outHeight;



    int lowerBound = (maxNumOfPixels == -1) ? 1 :

            (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));

    int upperBound = (minSideLength == -1) ? 128 :

            (int) Math.min(Math.floor(w / minSideLength),

            Math.floor(h / minSideLength));



    if (upperBound < lowerBound) {

        // return the larger one when there is no overlapping zone.

        return lowerBound;

    }



    if ((maxNumOfPixels == -1) &&

            (minSideLength == -1)) {

        return 1;

    } else if (minSideLength == -1) {

        return lowerBound;

    } else {

        return upperBound;

    }

} 

     ,          inSampleSize。

BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inJustDecodeBounds = true;

BitmapFactory.decodeFile(imageFile, opts);

   

opts.inSampleSize = computeSampleSize(opts, -1, 128*128);  

opts.inJustDecodeBounds = false;

try {

 Bitmap bmp = BitmapFactory.decodeFile(imageFile, opts);

 imageView.setImageBitmap(bmp);

    } catch (OutOfMemoryError err) {

    }

좋은 웹페이지 즐겨찾기