Skip to content

Commit

Permalink
纠正部分手机拍照照片旋转角度问题
Browse files Browse the repository at this point in the history
  • Loading branch information
crazycodeboy committed Sep 22, 2016
1 parent 0c3e1bd commit de0cc14
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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:[email protected]
*/
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;
}
}

0 comments on commit de0cc14

Please sign in to comment.