【Android】相册图片选取——图片旋转

从Android相册选取图片的时候需要手动进行旋转,否则竖屏(两种——正拿,反拿)拍的照片会横屏显示,横屏(也是两种)拍的照片也会出问题,照片会旋转90度,180度,270度,这个信息被记录在照片的exif信息中。

Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。简单地说,Exif=JPEG+拍摄参数。因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息。(来自百度百科)

在Exif信息中有一个就是记录拍照时候的状态的设备方向的:Orientation。在Android里面,获取这个信息的代码如下:

 1 //图片旋转
 2         ExifInterface exifInterface = null;
 3         try {
 4             exifInterface = new ExifInterface(fileName);
 5         } catch (IOException e) {
 6             // TODO Auto-generated catch block
 7             e.printStackTrace();
 8              // Calculate inSampleSize
 9             options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
10             // Decode bitmap with inSampleSize set
11             options.inJustDecodeBounds = false;
12             return BitmapFactory.decodeFile(fileName, options);
13         }
14         //获取图片的旋转角度
15         int tag = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
16         int orientation = 0;
17         if (tag == ExifInterface.ORIENTATION_ROTATE_90) {
18                 orientation = 90;
19         } else if (tag == ExifInterface.ORIENTATION_ROTATE_180) {
20                 orientation = 180;
21         } else if (tag == ExifInterface.ORIENTATION_ROTATE_270) {
22                 orientation = 270;
23         }

fileName是文件的绝对路径,获取的角度就记录在Orientation中。下面是图片旋转的代码:

1 options.inSampleSize = calculateInSampleSize(options, reqHeight, reqWidth);
2 options.inJustDecodeBounds = false;
3 Matrix m = new Matrix();
4 bitmap = BitmapFactory.decodeFile(fileName, options);
5 int width = bitmap.getWidth();
6 int height = bitmap.getHeight();
7 m.setRotate(orientation);
8 return Bitmap.createBitmap(bitmap, 0, 0, width, height, m, true);

(注:上面的代码融合代码的放缩操作,由caculateInSampleSize()进行)

原文地址:https://www.cnblogs.com/lqminn/p/2782815.html