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 }