在调用系统相机,拍照并保存在sdcard上后,有些图片是旋转过的,如何将他们再转回来了,我做了如下操作:
1.首先看图片的属性到底是旋转了多少度
/** * 读取图片属性:旋转的角度 * * @param path * 图片绝对路径 * @return degree旋转的角度 */ public 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(); } System.out.println("图片旋转了:" + degree + " 度"); return degree; }
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true;// 为true的情况下decodeFile并不分配空间,但可计算出原始图片的长度和宽度 // 获取这个图片的宽和高 bitmap = BitmapFactory.decodeFile(imagePath, options); // 此时返回bm为空 options.inSampleSize = calculateInSampleSize(options, 150, 150); // 重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeFile(imagePath, options); //如果图片旋转了,就给他转回来 if(degree!=0){ bitmap = UtilTool.rotaingImageView(degree,bitmap); } FileOutputStream out; try { out = new FileOutputStream(new File(Constant.SDCARD_ROOT_PATH + Constant.SAVE_PATH_IN_SDCARD + IMAGE_CAPTURE_NAME)); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); } catch (FileNotFoundException e) { e.printStackTrace(); }
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? widthRatio : heightRatio; } return inSampleSize; }
public static Bitmap rotaingImageView(int angle, Bitmap bitmap) { // 旋转图片 动作 Matrix matrix = new Matrix(); matrix.postRotate(angle); // 创建新的图片 Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); return resizedBitmap; }