广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    android bitmap compress(图片压缩)代码

    2018-04-09 07:42:21 次阅读 稿源:互联网
    广告

    android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片。
    有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络情况下),而且很耗流量,要想速度快,那么就需要减小图片的大小。减少图片的大小有两种方法,1. 照小图片; 2. 压缩大图片。 照相时获取小图片一般不太符合要求,因为,图片的清晰度会很差,但是这种情况有个好处就是应用速度会快些; 压缩图片,就是把大图片压缩小,降低图片的质量,在一定范围内,降低图片的大小,并且满足需求(图片仍就清晰)。下面组要是介绍图片的压缩:

    1. 照相请查看http://www.jb51.net/article/37760.htm ->想要保存图片到制定目录,启动Camera应用时,需要指定文件
    2. 压缩过程:
        2.1 从图片路径中读取图片(图片很大,不能全部加在到内存中处理,要是全部加载到内存中会内存溢出)
    [java]
    代码如下:

    final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(filePath, options);

        // Calculate inSampleSize 
        options.inSampleSize = calculateInSampleSize(options, 480, 800);

        // Decode bitmap with inSampleSize set 
        options.inJustDecodeBounds = false;

        Bitmap bm = BitmapFactory.decodeFile(filePath, options);

     final BitmapFactory.Options options = new BitmapFactory.Options();
      options.inJustDecodeBounds = true;
      BitmapFactory.decodeFile(filePath, options);

      // Calculate inSampleSize
      options.inSampleSize = calculateInSampleSize(options, 480, 800);

      // Decode bitmap with inSampleSize set
      options.inJustDecodeBounds = false;

      Bitmap bm = BitmapFactory.decodeFile(filePath, options);


    2.2 处理图片旋转 
    [java]
    代码如下:

    int degree = readPictureDegree(filePath);
            bm = rotateBitmap(bm,degree) ;

    int degree = readPictureDegree(filePath);
      bm = rotateBitmap(bm,degree) ;[java] view plaincopyprint?private static int readPictureDegree(String path) {  
               int degree  = 0;  
               try {  
                       ExifInterface exifInterface = new ExifInterface(path);  
                       int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);  
                       switch (orientation) {  
                       case ExifInterface.ORIENTATION_ROTATE_90:  
                               degree = 90;  
                               break;  
                       case ExifInterface.ORIENTATION_ROTATE_180:  
                               degree = 180;  
                               break;  
                       case ExifInterface.ORIENTATION_ROTATE_270:  
                               degree = 270;  
                               break;  
                       }  
               } catch (IOException e) {  
                       e.printStackTrace();  
               }  
               return degree;  
           } 

    private static int readPictureDegree(String path) {
            int degree  = 0;
            try {
                    ExifInterface exifInterface = new ExifInterface(path);
                    int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
                    switch (orientation) {
                    case ExifInterface.ORIENTATION_ROTATE_90:
                            degree = 90;
                            break;
                    case ExifInterface.ORIENTATION_ROTATE_180:
                            degree = 180;
                            break;
                    case ExifInterface.ORIENTATION_ROTATE_270:
                            degree = 270;
                            break;
                    }
            } catch (IOException e) {
                    e.printStackTrace();
            }
            return degree;
        }


    [java]
    代码如下:

    view plaincopyprint?private static Bitmap rotateBitmap(Bitmap bitmap, int rotate){
            if(bitmap == null)
                return null ;

            int w = bitmap.getWidth();
            int h = bitmap.getHeight();

            // Setting post rotate to 90 
            Matrix mtx = new Matrix();
            mtx.postRotate(rotate);
            return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
        }

    private static Bitmap rotateBitmap(Bitmap bitmap, int rotate){
      if(bitmap == null)
       return null ;

      int w = bitmap.getWidth();
      int h = bitmap.getHeight();

      // Setting post rotate to 90
      Matrix mtx = new Matrix();
      mtx.postRotate(rotate);
      return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
     }


    2.3压缩图片      
    [java]
    代码如下:

    bm.compress(Bitmap.CompressFormat.JPEG, 30, baos);//30 是压缩率,表示压缩70%; 如果不压缩是100,表示压缩率为0

    bm.compress(Bitmap.CompressFormat.JPEG, 30, baos);//30 是压缩率,表示压缩70%; 如果不压缩是100,表示压缩率为0


    完整的方法代码:
    [java]
    代码如下:

    public static Bitmap getSmallBitmap(String filePath) {

            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(filePath, options);

            // Calculate inSampleSize 
            options.inSampleSize = calculateInSampleSize(options, 480, 800);

            // Decode bitmap with inSampleSize set 
            options.inJustDecodeBounds = false;

            Bitmap bm = BitmapFactory.decodeFile(filePath, options);
            if(bm == null){
                return  null;
            }
            int degree = readPictureDegree(filePath);
            bm = rotateBitmap(bm,degree) ;
            ByteArrayOutputStream baos = null ;
            try{
                baos = new ByteArrayOutputStream();
                bm.compress(Bitmap.CompressFormat.JPEG, 30, baos);

            }finally{
                try {
                    if(baos != null)
                        baos.close() ;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return bm ;

        }

    public static Bitmap getSmallBitmap(String filePath) {

      final BitmapFactory.Options options = new BitmapFactory.Options();
      options.inJustDecodeBounds = true;
      BitmapFactory.decodeFile(filePath, options);

      // Calculate inSampleSize
      options.inSampleSize = calculateInSampleSize(options, 480, 800);

      // Decode bitmap with inSampleSize set
      options.inJustDecodeBounds = false;

      Bitmap bm = BitmapFactory.decodeFile(filePath, options);
      if(bm == null){
       return  null;
      }
      int degree = readPictureDegree(filePath);
      bm = rotateBitmap(bm,degree) ;
      ByteArrayOutputStream baos = null ;
      try{
       baos = new ByteArrayOutputStream();
       bm.compress(Bitmap.CompressFormat.JPEG, 30, baos);

      }finally{
       try {
        if(baos != null)
         baos.close() ;
       } catch (IOException e) {
        e.printStackTrace();
       }
      }
      return bm ;

     }

    [java]
    代码如下:

    view plaincopyprint?private 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;
            int inSampleSize = 1;

            if (height > reqHeight || width > reqWidth) {

                // Calculate ratios of height and width to requested height and 
                // width 
                final int heightRatio = Math.round((float) height
                        / (float) reqHeight);
                final int widthRatio = Math.round((float) width / (float) reqWidth);

                // Choose the smallest ratio as inSampleSize value, this will 
                // guarantee 
                // a final image with both dimensions larger than or equal to the 
                // requested height and width. 
                inSampleSize = heightRatio < widthRatio ? widthRatio : heightRatio;
            }

            return inSampleSize;
        }

    private 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;
      int inSampleSize = 1;

      if (height > reqHeight || width > reqWidth) {

       // Calculate ratios of height and width to requested height and
       // width
       final int heightRatio = Math.round((float) height
         / (float) reqHeight);
       final int widthRatio = Math.round((float) width / (float) reqWidth);

       // Choose the smallest ratio as inSampleSize value, this will
       // guarantee
       // a final image with both dimensions larger than or equal to the
       // requested height and width.
       inSampleSize = heightRatio < widthRatio ? widthRatio : heightRatio;
      }

      return inSampleSize;
     }

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告