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 }
原文地址:https://www.cnblogs.com/chq3272991/p/5316120.html