从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()进行)