효율적인 Bitmap 로드

3301 단어
비트맵은 안드로이드에서 png 포맷일 수도 있고 jpg 등 다른 일반적인 포맷일 수도 있다.
비트맵을 어떻게 불러옵니까?
BitmapFactory 클래스는 네 가지 static 방법을 제공합니다: decodeFile, decodeResource, decodeStream, decodeByteArray.
Bitmap icon = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.frequent_default);

비트맵을 효율적으로 탑재하는 핵심 사상
바로 비트맵팩토리를 통해서.옵션 클래스의 대상은 합리적인 inSample Size 속성 값을 설정한 다음에 옵션 대상을 방금 언급한bitmap을 불러오는 네 가지 static 방법에 전달합니다. 모두 BitmapFactory를 지원합니다.Options라는 매개변수.
public static Bitmap decodeResource(Resources res, int id, Options opts)

Sample Size: 샘플링 확률은 10241024 픽셀의 사진으로 ARGB8888 형식으로 저장되며 메모리 크기는 102410241244, 즉 4MB를 차지한다고 가정합니다.만약 inSampleSize가 2라면 샘플을 채취한 후의 그림의 폭은 원래의 1/2, 즉 51252 픽셀로 메모리 크기를 차지하는 512514, 즉 1MB이다.참고:
4
  • inSampleSize 값이 1보다 작게 설정되었을 때 그 역할은 1에 해당한다. 즉, 배율 효과가 없다

  • 4
  • 공식 문서에서 inSample Size 값이 2인 지수, 즉 1, 2, 4, 8, 16 등등을 권장합니다

  • 합리적인 inSampleSize 값 설정
    다음의 실제 상황을 고려하여 ImageView의 크기가 100100픽셀이고 그림의 원시 사이즈가 200200이라고 가정하면 inSampleSize를 2로 설정하면 된다. 만약에 그림의 원시 사이즈가 200300이면 inSampleSize를 2로 설정하고 축소된 그림의 사이즈가 100150이면 이 ImageView에 설정하는 것도 문제없다. 그러나 inSampleSize를 4로 설정하면 축소된 사이즈는 50*75로 설정한다.ImageView가 기대하는 크기에 도달하지 못하면 이 그림이 늘어나 모호해진다. 이것은 분명히 우리가 기대하는 것이 아니다.합리적인 샘플링 확률을 얻는 것도 간단하다. 다음과 같은 절차를 통해 얻을 수 있다.
    4
  • BitmapFactory.Options의 inJustDecodeBounds 매개 변수를true로 설정하고 그림을 불러옵니다

  • 4
  • BitmapFactory에서Options에서 그림의 원래 폭을 꺼냅니다. 이것은outWidth와outHeight 매개 변수에 대응합니다

  • 4
  • 목표View에 필요한 크기와 결합하여 inSampleSize의 값을 계산한다

  • 4
  • BitmapFactory.Options의 inJust Decode Bounds 매개 변수를false로 설정한 다음 그림을 새로 불러옵니다

  • 여기에 inJust Decode Bounds 매개 변수의 의미를 설명한다. 이 매개 변수가true일 때Bitmap Factory는 그림의 원시적이고 넓은 정보만 해석할 뿐 그림을 실제로 불러오지 않기 때문에 이 조작은 경량급이다.위 절차에 대해 코드로 구현:
    public static Bitmap decodeResourceEx(Resources res, int resId, int reqWidth, reqHeight) {
        //first, decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, id, options);
    
        int originWidth = options.outWidth;
        int originHeight = options.outHeight;
    
        //calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(originWidth, originHeight, reqWidth, reqHeight);
    
        //Decode bitmap with inSampleSize
        options.inJustDecodeBounds = false;
        return BitmapFacotry.decodeResource(res, resId, options);
    
    }
    
    private int calculateInSampleSize(originWidth, originHeight, reqWidth, reqHeight) {
        int inSampleSize = 1;
        if(originWidth>reqWidth || originHeight>reqHeight) {
            final int halfWidth = originWidth / 2;
            final int halfHeight = originHeight / 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.
            while(((halfWidth/inSampleSize) >= reqWidth) &&((halfHeight/inSampleSize) >= reqHeight)) {
                inSampleSize *= 2;
            }
        }
    
        return inSampleSize;
    }
    

    예를 들어 ImageView가 원하는 이미지 크기가 100*100 픽셀인 경우 다음과 같은 방법으로 이미지를 효율적으로 로드하고 표시할 수 있습니다.
    mImageView.setImageBitmap(decodeResourceEx(getResources(), R.id.myImage, 100, 100));
    

    좋은 웹페이지 즐겨찾기