關於自定義相機照片橫豎屏轉換問題的解決
阿新 • • 發佈:2019-02-02
在自定義相機中,橫豎屏拍照時,其顯示的圖片與預覽的時候方向不一致,有以下2種方法:
第一種:比較普遍,
/**
* 獲取圖片的旋轉角度,有些系統把拍照的圖片旋轉了,有的沒有旋轉
*/
int degree = readPictureDegree(f.getAbsolutePath());
BitmapFactory.Options opts=new BitmapFactory.Options();//獲取縮圖顯示到螢幕上
opts.inSampleSize=2;
Bitmap cbitmap=BitmapFactory.decodeFile(f.getAbsolutePath(),opts);
/**
* 把圖片旋轉為正的方向
*/
Bitmap newbitmap = rotaingImageView(degree, cbitmap);
iv.setImageBitmap(newbitmap);
當然,在第一種的基礎上,如果獲取的degree一直為0,但照片角度還不對時,就要用到第二種方法:
//監聽螢幕的方向
mScreenOrientationEventListener=new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int orientation) {
// TODO Auto-generated method stub
// i的範圍是0~359
// 螢幕左邊在頂部的時候 i = 90;
// 螢幕頂部在底部的時候 i = 180;
// 螢幕右邊在底部的時候 i = 270;
// 正常情況預設i = 0;
if(45 <= orientation && orientation < 135) {
screen = ExifInterface.ORIENTATION_ROTATE_180;
} else if(135 <= orientation && orientation < 225) {
screen = ExifInterface.ORIENTATION_ROTATE_270;
} else if(225 <= orientation && orientation < 315) {
screen = ExifInterface.ORIENTATION_NORMAL;
} else {
screen = ExifInterface.ORIENTATION_ROTATE_90;
}
}
};
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (camera != null) {
Camera.Parameters parameters = camera.getParameters();
/* 設定相片格式為JPEG */
parameters.setPictureFormat(PixelFormat.JPEG);
switch (screen) {
case 0:
parameters.setRotation(90);
break;
case 90:
parameters.setRotation(0);
break;
case 180:
parameters.setRotation(270);
break;
case 270:
parameters.setRotation(180);
break;
default:
break;
}
switch (screen) {
case 0:
camera.setDisplayOrientation(90);
break;
case 90:
camera.setDisplayOrientation(0);
break;
case 180:
camera.setDisplayOrientation(270);
break;
case 270:
camera.setDisplayOrientation(180);
break;
default:
break;
}
camera.startPreview();
}
}
@SuppressLint("NewApi")
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();
// 設定camera預覽的角度,因為預設圖片是傾斜90度的
camera.setDisplayOrientation(90);
// 設定holder主要是用於surfaceView的圖片的實時預覽,以及獲取圖片等功能
camera.setPreviewDisplay(holder);
} catch (Exception e) {
if (camera != null) {
camera.release();
camera = null;
}
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.stopPreview();
camera.release();
camera = null;
}
}
});
通過以上方法,自定義相機圖片旋轉類似的問題基本都可以解決
有問題歡迎交流 QQ 2240405944