안 드 로 이 드 가 정리 한 그림 압축 도구 클래스

Android 장치 의 메모리 가 제한 되 어 있 습 니 다.큰 그림 은 압축 한 다음 에 표시 해 야 합 니 다.그렇지 않 으 면 메모리 가 넘 칠 수 있 습 니 다:OOM;
처리 정책:
1.미리 보기 그림(Thumbnails)사용 하기;
Android 시스템 은 검 측 된 그림 에 미리 보기 그림 을 만 듭 니 다.미디어 콘 텐 츠 제공 자의 Image 를 조작 하여 그림 을 조작 할 수 있 습 니 다.
2.수 동 압축:
  • (1)그림 과 스크린 사이즈 에 따라 등비 압축 하여 완벽 하 게 표시 한다.
  • (2)그림 의 질 을 낮 추고 그림 의 크기 를 압축 한다.
  • 다음은 자신 이 정리 한 작은 도구 류 입 니 다.(비례 에 따라 크기 를 조정 한 후에 품질 크기 를 조정 하지 않 았 습 니 다.이때 그림 크기 는 우리 가 원 하 는 제한 을 초과 할 수 있 습 니 다.만약 에 우리 가 엄격 한 크기 제한 수요 가 있다 면 먼저 비례 에 따라 크기 를 조정 한 후에 이때 그림 의 크기 가 제한 을 초과 하 는 지 판단 할 수 있다.제한 을 초과 하면 품질 크기 를 조정 하면 됩 니 다.비율 에 따라 크기 를 조정 하 는 것 을 권장 합 니 다.품질 에 따라 크기 를 조정 하면 그림 이 일 그 러 질 수 있 습 니 다.)
    
    </pre><p><pre name="code" class="java">package com.util; 
    import java.io.ByteArrayOutputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import android.graphics.Bitmap; 
    import android.graphics.Matrix; 
    import android.graphics.Bitmap.CompressFormat; 
    import android.graphics.BitmapFactory; 
    import android.media.ExifInterface; 
    /** 
     *         
     * @author  Life_ 
     */ 
    public class ImageCompressUtil { 
      /** 
       *                
       * @param bmp 
       *                 
       * @param maxSize 
       *                 ,  KB 
       * @return            
       */ 
      public static Bitmap compressByQuality(Bitmap bitmap, int maxSize) { 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        int quality = 100; 
        bitmap.compress(CompressFormat.JPEG, quality, baos); 
        System.out.println("       :" + baos.toByteArray().length + "byte"); 
        boolean isCompressed = false; 
        while (baos.toByteArray().length / 1024 > maxSize) { 
          quality -= 10; 
          baos.reset(); 
          bitmap.compress(CompressFormat.JPEG, quality, baos); 
          System.out.println("        " + quality + "%    :" 
              + baos.toByteArray().length + "byte"); 
          isCompressed = true; 
        } 
        System.out.println("       :" + baos.toByteArray().length + "byte"); 
        if (isCompressed) { 
          Bitmap compressedBitmap = BitmapFactory.decodeByteArray( 
              baos.toByteArray(), 0, baos.toByteArray().length); 
          recycleBitmap(bitmap); 
          return compressedBitmap; 
        } else { 
          return bitmap; 
        } 
      } 
      /** 
       *     url,                
       * @param pathName         
       * @param targetWidth         
       * @param targetHeight         
       * @return        
       */ 
      public static Bitmap compressBySize(String pathName, int targetWidth, 
          int targetHeight) { 
        BitmapFactory.Options opts = new BitmapFactory.Options(); 
        opts.inJustDecodeBounds = true;//         ,           ,     ; 
        Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts); 
        //        、  ; 
        int imgWidth = opts.outWidth; 
        int imgHeight = opts.outHeight; 
        //         、       、     ;             ; 
        int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth); 
        int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight); 
        if (widthRatio > 1 || heightRatio > 1) { 
          if (widthRatio > heightRatio) { 
            opts.inSampleSize = widthRatio; 
          } else { 
            opts.inSampleSize = heightRatio; 
          } 
        } 
        //         ,       ; 
        opts.inJustDecodeBounds = false; 
        bitmap = BitmapFactory.decodeFile(pathName, opts); 
        return bitmap; 
      } 
      /** 
       *   bitmap,                  
       * @param bitmap       
       * @param targetWidth         
       * @param targetHeight         
       * @return        
       */ 
      public static Bitmap compressBySize(Bitmap bitmap, int targetWidth, 
          int targetHeight) { 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        bitmap.compress(CompressFormat.JPEG, 100, baos); 
        BitmapFactory.Options opts = new BitmapFactory.Options(); 
        opts.inJustDecodeBounds = true; 
        bitmap = BitmapFactory.decodeByteArray(baos.toByteArray(), 0, 
            baos.toByteArray().length, opts); 
        //        、  ; 
        int imgWidth = opts.outWidth; 
        int imgHeight = opts.outHeight; 
        //         、       、     ;           ; 
        int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth); 
        int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight); 
        if (widthRatio > 1 || heightRatio > 1) { 
          if (widthRatio > heightRatio) { 
            opts.inSampleSize = widthRatio; 
          } else { 
            opts.inSampleSize = heightRatio; 
          } 
        } 
        //         ,       ; 
        opts.inJustDecodeBounds = false; 
        Bitmap compressedBitmap = BitmapFactory.decodeByteArray( 
            baos.toByteArray(), 0, baos.toByteArray().length, opts); 
        recycleBitmap(bitmap); 
        return compressedBitmap; 
      } 
      /** 
       *                 ,        ,                           ; 
       * @param InputStream      ,        
       * @param targetWidth         
       * @param targetHeight         
       * @return        
       * @throws IOException             
       */ 
      public static Bitmap compressBySize(InputStream is, int targetWidth, 
          int targetHeight) throws IOException { 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        byte[] buff = new byte[1024]; 
        int len = 0; 
        while ((len = is.read(buff)) != -1) { 
          baos.write(buff, 0, len); 
        } 
        byte[] data = baos.toByteArray(); 
        BitmapFactory.Options opts = new BitmapFactory.Options(); 
        opts.inJustDecodeBounds = true; 
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, 
            opts); 
        //        、  ; 
        int imgWidth = opts.outWidth; 
        int imgHeight = opts.outHeight; 
        //         、       、     ;           ; 
        int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth); 
        int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight); 
        if (widthRatio > 1 || heightRatio > 1) { 
          if (widthRatio > heightRatio) { 
            opts.inSampleSize = widthRatio; 
          } else { 
            opts.inSampleSize = heightRatio; 
          } 
        } 
        //         ,       ; 
        opts.inJustDecodeBounds = false; 
        bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opts); 
        return bitmap; 
      } 
      /** 
       *          
       * @param srcPath 
       * @param bitmap 
       * @return 
       */ 
      public static Bitmap rotateBitmapByExif(String srcPath, Bitmap bitmap) { 
        ExifInterface exif; 
        Bitmap newBitmap = null; 
        try { 
          exif = new ExifInterface(srcPath); 
          if (exif != null) { //             
            int ori = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
                ExifInterface.ORIENTATION_NORMAL); 
            int digree = 0; 
            switch (ori) { 
            case ExifInterface.ORIENTATION_ROTATE_90: 
              digree = 90; 
              break; 
            case ExifInterface.ORIENTATION_ROTATE_180: 
              digree = 180; 
              break; 
            case ExifInterface.ORIENTATION_ROTATE_270: 
              digree = 270; 
              break; 
            } 
            if (digree != 0) { 
              Matrix m = new Matrix(); 
              m.postRotate(digree); 
              newBitmap = Bitmap.createBitmap(bitmap, 0, 0, 
                  bitmap.getWidth(), bitmap.getHeight(), m, true); 
              recycleBitmap(bitmap); 
              return newBitmap; 
            } 
          } 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
        return bitmap; 
      } 
      /** 
       *        
       * @param bitmap 
       */ 
      public static void recycleBitmap(Bitmap bitmap) { 
        if (bitmap != null && !bitmap.isRecycled()) { 
          bitmap.recycle(); 
          System.gc(); 
          bitmap = null; 
        } 
      } 
    }
    총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.

    좋은 웹페이지 즐겨찾기