最近在使用拍照功能时,遇到三星手机拍照就会偏转90度,最后度娘一番,找到了解决方案。
下面就写下自已的解决方案。
ToolImage工具类。
package cn.xa.tjy.lib.utils;
import android.annotation.TargetApi;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.ExifInterface;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.FloatRange;
import android.support.annotation.IntRange;
import android.view.View;
import com.blankj.utilcode.util.FileIOUtils;
import com.blankj.utilcode.util.FileUtils;
import com.blankj.utilcode.util.ImageUtils;
import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import cn.xa.tjy.lib.constant.ConString;
/**
* action:图片相关工具类
* Created by bsh_kt on 2017/6/20.
* des:
*/
public class ToolImage {
private static String getPath(String path) {
return "_" + ToolTime.longTimeToStrYMDHMSPath(System.currentTimeMillis()) + ".jpeg";
}
/**
* 旋转图片
*
* @param angle 被旋转角度
* @param bitmap 图片对象
* @return 旋转后的图片
*/
public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
Bitmap returnBm = null;
// 根据旋转角度,生成旋转矩阵
Matrix matrix = new Matrix();
matrix.postRotate(angle);
try {
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
} catch (OutOfMemoryError e) {
}
if (returnBm == null) {
returnBm = bitmap;
}
if (bitmap != returnBm) {
bitmap.recycle();
}
return returnBm;
}
/**
* 读取照片exif信息中的旋转角度
*
* @param path 照片路径
* @return角度
*/
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();
}
return degree;
}
/**
* 较正图片角度
*
* @param absolutePath
* @return
*/
public static String correctImage(String absolutePath) {
StringBuilder sb = new StringBuilder();
int degreen = ToolImage.readPictureDegree(absolutePath);
ToolLog.d(ConString.TAG, "ToolImage图片旋转的角度是:" + degreen);
String newPath = absolutePath;
if (degreen != 0) {
sb.setLength(0);
int lastIndex = absolutePath.lastIndexOf(".");
newPath = sb.append(absolutePath.substring(0, lastIndex))
.append(1)
.append(absolutePath.substring(lastIndex))
.toString();
Bitmap bitmapAbsolute = BitmapFactory.decodeFile(absolutePath);
//对图片进行旋转轿正
Bitmap bitmapCorrect = ToolImage.rotaingImageView(degreen, bitmapAbsolute);
boolean ret = ToolImage.save(bitmapCorrect, newPath, Bitmap.CompressFormat.JPEG, true);
if (ret) {
ToolFileUtils.removeFile(absolutePath);
}
}
return newPath;
}
}
下面是上面用的save工具类
package com.blankj.utilcode.util;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.ExifInterface;
import android.os.Build;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
import android.support.annotation.ColorInt;
import android.support.annotation.DrawableRes;
import android.support.annotation.FloatRange;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v4.content.ContextCompat;
import android.view.View;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2016/08/12
* desc : utils about image
* </pre>
*/
public final class ImageUtils {
private ImageUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* Save the bitmap.
*
* @param src The source of bitmap.
* @param filePath The path of file.
* @param format The format of the image.
* @return {@code true}: success<br>{@code false}: fail
*/
public static boolean save(final Bitmap src,
final String filePath,
final CompressFormat format) {
return save(src, getFileByPath(filePath), format, false);
}
/**
* Save the bitmap.
*
* @param src The source of bitmap.
* @param file The file.
* @param format The format of the image.
* @return {@code true}: success<br>{@code false}: fail
*/
public static boolean save(final Bitmap src, final File file, final CompressFormat format) {
return save(src, file, format, false);
}
/**
* Save the bitmap.
*
* @param src The source of bitmap.
* @param filePath The path of file.
* @param format The format of the image.
* @param recycle True to recycle the source of bitmap, false otherwise.
* @return {@code true}: success<br>{@code false}: fail
*/
public static boolean save(final Bitmap src,
final String filePath,
final CompressFormat format,
final boolean recycle) {
return save(src, getFileByPath(filePath), format, recycle);
}
/**
* Save the bitmap.
*
* @param src The source of bitmap.
* @param file The file.
* @param format The format of the image.
* @param recycle True to recycle the source of bitmap, false otherwise.
* @return {@code true}: success<br>{@code false}: fail
*/
public static boolean save(final Bitmap src,
final File file,
final CompressFormat format,
final boolean recycle) {
if (isEmptyBitmap(src) || !createFileByDeleteOldFile(file)) return false;
OutputStream os = null;
boolean ret = false;
try {
os = new BufferedOutputStream(new FileOutputStream(file));
ret = src.compress(format, 100, os);
if (recycle && !src.isRecycled()) src.recycle();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return ret;
}
}
调用方法:其中filepath是拍照之后获取的手机路径。newPath即为较正之后的图片路径。
String newPath=ToolImage.correctImage(filePath);
final Bitmap bitmap = BitmapFactory.decodeFile(newPath);
imageView.setImageBitmap(bitmap)