zoukankan      html  css  js  c++  java
  • Android图片处理-图片压缩处理

    这里先重复温习一下上一篇,调用相册获取图片:

    1 /***
    2 * 这个是调用android内置的intent,来过滤图片文件 ,同时也可以过滤其他的
    3 */
    4 Intent intent = new Intent();
    5 intent.setType("image/*");
    6 intent.setAction(Intent.ACTION_GET_CONTENT);
    7 startActivityForResult(intent, 1);

    获取选择的图片:

     1 if (resultCode == Activity.RESULT_OK) {           
     2             Uri uri = data.getData();
     3             try {
     4                 String[] pojo = { MediaStore.Images.Media.DATA };
     5  
     6                 Cursor cursor = managedQuery(uri, pojo, null, null, null);
     7                 if (cursor != null) {
     8                     ContentResolver cr = this.getContentResolver();
     9                     int colunm_index = cursor
    10                             .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    11                     cursor.moveToFirst();
    12                     String path = cursor.getString(colunm_index);
    13                     /***
    14                      * 这里加这样一个判断主要是为了第三方的软件选择,比如:使用第三方的文件管理器的话,你选择的文件就不一定是图片了,
    15                      * 这样的话,我们判断文件的后缀名 如果是图片格式的话,那么才可以
    16                      */
    17                     if (path.endsWith("jpg") || path.endsWith("png")) {
    18                         picPath = path;
    19                         Bitmap bitmap = PictureUtil.getSmallBitmap(picPath,480,320,50);
    20                         //        
    21                         imageShow.setImageBitmap(bitmap);
    22                         //这里更新发布分享按键的可点出状态
    23                         btnSubmit.setEnabled(true);
    24                     
    25                     } else {
    26                         alert();
    27                     }
    28                 } else {
    29                     alert();
    30                 } 
    31             } catch (Exception e) {
    32             }
    33         }

    压缩处理类:

      1 /**
      2  * @Description 调用系统拍照或进入图库中选择照片,再进行裁剪,压缩.
      3  * @author chq
      4  */
      5 public class PictureUtil {
      6     //加载并显示一副图像对内存使用情况有显著的影响,Android提供了一个名为BitmapFactory 的实用程序类,该程序提供了一系列的静态方法,允许通过各种来源加载Bitmap图像。针对我们的需求,将从文件加载图像,并在最初的活动中显示它。幸运的是,BitmapFactory中的可用方法将会调用BitmapFactory.Options类,这使得我们能够定义如何将Bitmap读入内存。具体而言,当加载图像时,可以设置BitmapFactory应该使用的采样大小。在BitmapFactory.Options中指定inSampleSize参数。例如,将inSampleSize
      7     //= 8时,产生一幅图的大小是原始大小的1/8。要注意的是首先应将BitmapFactoryOptions.inJustDecodeBounds变量设置为true,这将通知BitmapFactory类只需返回该图像的范围,而无需尝试解码图像本身。最后将BitmapFactory.Options.inJustDecodeBounds设置为false,最后对其进行真正的解码。
      8     /**
      9      * 
     10      * @param picPath
     11      * @param reqWidth
     12      * @param reqHeight
     13      * @param compress
     14      * @return
     15      */
     16     public static Bitmap getSmallBitmap(String picPath,int reqWidth,int reqHeight,int compress) {
     17         final BitmapFactory.Options options = new BitmapFactory.Options();
     18         options.inJustDecodeBounds = true;   
     19         BitmapFactory.decodeFile(picPath, options);  //options中将获得图片一些信息
     20         options.inSampleSize = calulateInSampleSize(options, reqWidth, reqHeight);
     21         options.inJustDecodeBounds = false;  
     22         
     23         Bitmap bitmap = BitmapFactory.decodeFile(picPath, options);
     24         if (bitmap == null) {
     25             return null;
     26         }
     27         int degree = readPictureDegree(picPath);
     28         bitmap = rotateBitmap(bitmap, degree);
     29         ByteArrayOutputStream baos = null;
     30         try {
     31             baos = new ByteArrayOutputStream();
     32             //压缩图片质量
     33             bitmap.compress(Bitmap.CompressFormat.JPEG,compress, baos);
     34         } catch (Exception e) {
     35             e.printStackTrace();
     36         } finally {
     37             try {
     38                 if(baos != null) {
     39                     baos.close();
     40                 }
     41             } catch (IOException e) {
     42                 e.printStackTrace();
     43             }
     44         }
     45         return bitmap;
     46     }
     47     
     48     private static int calulateInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight) {
     49         //Raw height and width of image
     50         final int height = options.outHeight;
     51         final int width = options.outWidth;
     52         int inSampleSize = 1;
     53         
     54         if(height>reqHeight || width>reqWidth) {
     55             final int heightRatio = Math.round((float)height / (float)reqHeight);
     56             final int widthRatio = Math.round((float)width / (float)reqWidth);
     57             // Choose the smallest ratio as inSampleSize value, this will
     58             // guarantee
     59             // a final image with both dimensions larger than or equal to the
     60             // requested height and width.
     61             inSampleSize = heightRatio < widthRatio ? widthRatio : heightRatio;
     62         }
     63         return inSampleSize;
     64     }
     65     
     66     /**
     67      * 读取图片旋转处理
     68      * @param path
     69      * @return
     70      */
     71     private static int readPictureDegree(String path) {
     72         int degree = 0;
     73         try {
     74             ExifInterface exifInterface = new ExifInterface(path);
     75             int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
     76             switch (orientation) {
     77             case ExifInterface.ORIENTATION_ROTATE_90:
     78                 degree = 90;
     79                 break;
     80             case ExifInterface.ORIENTATION_ROTATE_180:
     81                 degree = 180;
     82                 break;
     83             case ExifInterface.ORIENTATION_ROTATE_270:
     84                 degree = 270;
     85                 break;
     86             default:
     87                 break;
     88             }
     89         } catch (IOException e) {
     90             e.printStackTrace();
     91         }
     92         return degree;
     93     }
     94     /**
     95      * 图片旋转处理
     96      * @param bitmap
     97      * @param rotate
     98      * @return
     99      */
    100     private static Bitmap rotateBitmap(Bitmap bitmap,int rotate) {
    101         if(bitmap == null) {
    102             return null;
    103         }
    104         int w = bitmap.getWidth();
    105         int h = bitmap.getHeight();
    106         Matrix mtx = new Matrix();
    107         mtx.postRotate(rotate);
    108         return Bitmap.createBitmap(bitmap,0,0,w,h,mtx,true);
    109     }        
    110 }
  • 相关阅读:
    springMVC学习总结(四)springmvc处理json数据类型以及fastjson的使用
    springMVC学习总结(二)路径映射和请求方法限定
    springMVC学习总结(一)快速入门
    【学习整理】第九章节 魔法方法,属性和迭代器
    【学习整理】第八章 异常
    【学习整理】第六章 抽象
    【学习整理】第七章 更加抽象
    【学习整理】第五章 条件、循环和其他语句
    transform css3 的使用及理解
    关于垂直居中---未完待续
  • 原文地址:https://www.cnblogs.com/chq3272991/p/5316120.html
Copyright © 2011-2022 走看看