From de0cc14793acb1ebcfceb678683eaf29b1f01cf2 Mon Sep 17 00:00:00 2001 From: crazycodeboy Date: Thu, 22 Sep 2016 11:03:46 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BA=A0=E6=AD=A3=E9=83=A8=E5=88=86=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E6=8B=8D=E7=85=A7=E7=85=A7=E7=89=87=E6=97=8B=E8=BD=AC?= =?UTF-8?q?=E8=A7=92=E5=BA=A6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jph/takephoto/app/TakePhotoImpl.java | 3 + .../jph/takephoto/uitl/ImageRotateUtil.java | 102 ++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 takephoto_library/src/main/java/com/jph/takephoto/uitl/ImageRotateUtil.java diff --git a/takephoto_library/src/main/java/com/jph/takephoto/app/TakePhotoImpl.java b/takephoto_library/src/main/java/com/jph/takephoto/app/TakePhotoImpl.java index 60d1a6a5..4e976022 100644 --- a/takephoto_library/src/main/java/com/jph/takephoto/app/TakePhotoImpl.java +++ b/takephoto_library/src/main/java/com/jph/takephoto/app/TakePhotoImpl.java @@ -21,6 +21,7 @@ import com.jph.takephoto.model.TImage; import com.jph.takephoto.model.TIntentWap; import com.jph.takephoto.model.TResult; +import com.jph.takephoto.uitl.ImageRotateUtil; import com.jph.takephoto.uitl.IntentUtils; import com.jph.takephoto.uitl.TConstant; import com.jph.takephoto.model.TException; @@ -145,6 +146,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { break; case TConstant.RC_PICK_PICTURE_FROM_CAPTURE_CROP://拍取照片,并裁剪 if (resultCode == Activity.RESULT_OK) { + ImageRotateUtil.of().correctTmage(outPutUri.getPath()); try { onCrop(outPutUri, outPutUri, cropOptions); } catch (TException e) { @@ -157,6 +159,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { break; case TConstant.RC_PICK_PICTURE_FROM_CAPTURE://拍取照片 if (resultCode == Activity.RESULT_OK) { + ImageRotateUtil.of().correctTmage(outPutUri.getPath()); try { takeResult(TResult.of(TImage.of(TUriParse.getFilePathWithUri(outPutUri, contextWrap.getActivity())))); } catch (TException e) { diff --git a/takephoto_library/src/main/java/com/jph/takephoto/uitl/ImageRotateUtil.java b/takephoto_library/src/main/java/com/jph/takephoto/uitl/ImageRotateUtil.java new file mode 100644 index 00000000..00cb830e --- /dev/null +++ b/takephoto_library/src/main/java/com/jph/takephoto/uitl/ImageRotateUtil.java @@ -0,0 +1,102 @@ +package com.jph.takephoto.uitl; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; +import android.media.ExifInterface; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * 图片旋转角度修正工具类 + * Author: crazycodeboy + * Date: 2016/9/21 0007 20:10 + * Version:3.0.0 + * 技术博文:http://www.cboy.me + * GitHub:https://github.com/crazycodeboy + * Eamil:crazycodeboy@gmail.com + */ +public class ImageRotateUtil { + + public static ImageRotateUtil of(){ + return new ImageRotateUtil(); + } + + private ImageRotateUtil() { + } + public void correctTmage(String path){ + int degree; + if((degree=getBitmapDegree(path))!=0){ + Bitmap bitmap= BitmapFactory.decodeFile(path); + if(bitmap==null)return; + Bitmap resultBitmap=rotateBitmapByDegree(bitmap,degree); + if(resultBitmap==null)return; + try { + resultBitmap.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream(new File(path))); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + } + + /** + * 读取图片的旋转的角度 + * + * @param path 图片绝对路径 + * @return 图片的旋转角度 + */ + private int getBitmapDegree(String path) { + int degree = 0; + try { + // 从指定路径下读取图片,并获取其EXIF信息 + 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; + } + + /** + * 将图片按照某个角度进行旋转 + * + * @param bm 需要旋转的图片 + * @param degree 旋转角度 + * @return 旋转后的图片 + */ + private Bitmap rotateBitmapByDegree(Bitmap bm, int degree) { + Bitmap returnBm = null; + + // 根据旋转角度,生成旋转矩阵 + Matrix matrix = new Matrix(); + matrix.postRotate(degree); + try { + // 将原始图片按照旋转矩阵进行旋转,并得到新的图片 + returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); + } catch (OutOfMemoryError e) { + } + if (returnBm == null) { + returnBm = bm; + } + if (bm != returnBm) { + bm.recycle(); + } + return returnBm; + } +}