在部分Android手机(如MT788、Note2)上,使用Camera拍照以后,得到的照片会被自动旋转(90°、180°、270°),这个情况很不符合预期。仔细分析了一下,因为照片属性中是存储了旋转信息的,所以要解决这个问题,可以在onActivityResult方法中,获取到照片数据后,读取它的旋转信息,如果不是0,说明这个照片已经被旋转过了,那么再使用android.graphics.Matrix将照片旋转回去即可。
1、读取图片的旋转属性
/**
* 读取图片的旋转的角度
*
* @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;
}
|
2、将图片按照某个角度进行旋转
/**
* 将图片按照某个角度进行旋转
*
* @param bm
* 需要旋转的图片
* @param degree
* 旋转角度
* @return 旋转后的图片
*/
public
static
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;
}
第一步: AndroidManifest.xml 在Activity添加以下一个属性
?
<span>android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="sensor",为的是能够横竖屏切换不用再次调用onCreate方法,直接调用onConfigurationChanged方法。screenSize是兼容4.0
系统的才可以生效,否则方法没效。</span>
?
<application
android:label="@string/app_name"
android:icon="@drawable/ic_launcher">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
<span
style="color:
#ff0000;">android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="sensor"</span>>
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
第二步,解决竖屏拍照后保存图片会旋转90度的问题。这里只能够采取曲线救国了,就是把已经拍好的图片用代码旋转90度。
首先判断当前是横拍还是竖拍,然后在调用相机拍照后,在保存图片的方法里,进行竖拍的照片90度旋转。
PictureCallback
jpeg = new PictureCallback()
{
@Override
public void onPictureTaken(byte[]
data, Camera camera) {
//
TODO Auto-generated method stub
Bitmap
bMap;
try
{//
获得图片
bMap = BitmapFactory.decodeByteArray(data, 0, data.length);
Bitmap bMapRotate;
Configuration config = getResources().getConfiguration();
if (config.orientation==1)
{ // 坚拍
Matrix matrix = new Matrix();
matrix.reset();
matrix.postRotate(270);
bMapRotate = Bitmap.createBitmap(bMap, 0, 0,
bMap.getWidth(), bMap.getHeight(),
matrix, true);
bMap = bMapRotate;
}
//
Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
File
file = new File(filePath);
BufferedOutputStream
bos =
new BufferedOutputStream(new FileOutputStream(file));
bMap.compress(Bitmap.CompressFormat.JPEG,
100,
bos);//将图片压缩到流中
bos.flush();//输出
bos.close();//关闭
}catch(Exception
e)
{
e.printStackTrace();
}
}
};
关键代码是以上。
当用竖拍转横拍,还是横拍转竖拍,都要先在surfaceChanged方法,停止预览相机,重新设置下摄像头就不会再出现90度旋转。
|