您的位置:首页 > 移动开发 > Android开发

解决图片旋转问题

2017-01-16 18:55 435 查看
从相册中选择图片发现图片旋转了 有的选择90° 有的旋转270° 旋转度数不定。

之前在相机拍照是也有遇到过拍摄的图片与预览的相比旋转了90°,

不过相机那个旋转度数的固定的,当时只是将每张拍摄所得的图片都旋转90° 解决了问题,

然而这个问题旋转度数不定,该如何解决呢?

其实也很简单

1:判断旋转度数

//获取图片的旋转度数
public static int getExifOrientation(String filepath) {
int degree = 0;
ExifInterface exif = null;
try {
exif = new ExifInterface(filepath);
} catch (IOException ex) {
Log.e(TAG, "cannot read exif", ex);
}
if (exif != null) {
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION, -1);
if (orientation != -1) {
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;
}

}
}
return degree;
}


2:旋转回正常图片。

public static Bitmap rotate(Bitmap b, int degrees) {
Bitmap b2 = null;
if (degrees != 0 && b != null) {
Matrix m = new Matrix();
m.postRotate(degrees);
try {
b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, true);

} catch (Exception ex) {
b2 = b;
Log.i(TAG,"图片选择错误"+ex.getMessage());
}
}
return b2;
}

3:因为图片的处理比较耗时 所以在工作线程中执行 防止造成卡顿现象

public void handleImage(String outpath,String temppath,String localpath,CallBack callback){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try{
int orientation = BitmapUtil.readPictureDegree(localpath);
Log.i(TAG,"图片选择角度:" + orientation);
if(orientation!=0){
BitmapUtil.compressAndGenImage(localpath, temppath,400,false);//压缩
Bitmap bitmap = BitmapUtil.rotate(BitmapUtil.getBitmap(temppath),orientation);//旋转
BitmapUtil.storeImage(bitmap,outpath);//存储
}else{
BitmapUtil.compressAndGenImage(localpath, outpath,400,false);//压缩
}
callback.call(outpath);//将得到的路径回调
}catch (Exception e){
Log.i(TAG,e.getMessage());
}

}
});
thread.start();
}


4:注意我这里是先进行质量压缩 在进行旋转操作 但是在判断旋转角度的时候 一定要使用相册中选择的地址(localpath),如果使用       我们压缩后的存储地址(outpath)我们得到的旋转角度将会一直的0.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息