Android Camera開發解析度 清晰度 影象變形
但是通過打Log看出當時設定的時候解析度是改變了的,然而正是拍照的時候解析度又變回系統預設的了,在不同的機子上預設的解析度不同。setParameters failed 問題我的華為的預設的previewSize是最高的,然而pictureSize又是最低的:
導致預覽的圖片十分清晰,而拍出的照片十分小且模糊。同樣使用預設解析度,在一些機子上會出現預覽變形的情況。
1.設定預覽分辨路和圖片解析度:
Camera.Parameters param = camera.getParameters();
param.setPreviewSize(width, height); //width一般大於height
param.setPictureSize(width, height);//width一般大於height setParameters failed問題解決:
camera.setPerviewSize(screenWidth,screenHeight);// 不要這樣設定,不然不會設定成功的;
camera.setPerviewSize(screenHeight , screenWidth );//應該這樣設定,第一個引數大於後面那個引數
params.set("orientation", "landscape");//這樣設定也可以
camera.setDisplayOrientation(90);//相機旋轉90度,便成豎屏
camera.setParameters(param);//這句話不要忘記
2. setParameters failed問題解決:
java.lang.RuntimeException: setParameters failed
at android.hardware.Camera.native_setParameters(Native Method)
at android.hardware.Camera.setParameters(Camera.java:1834)
3.width一般大於height,因為預設的攝像頭是橫向的
camera.setDisplayOrientation(90);
4.預覽變形解決:
一般手機螢幕解析度為16:9,而可能預設的預覽解析度是4:3的,
然而我們在設定佈局檔案的時候設定的預覽介面SurfaceView寬高均為match_parent,讓預覽介面充滿螢幕,
所以自然就會出現預覽變形的情況。
<SurfaceView
android:id="@+id/surface_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
通過Context進行:
WindowManager windowManager = mcontext.getWindowManager();
Display display = windowManager.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
//獲取螢幕的寬和高
display.getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
計算預覽解析度的寬高比:
public String getSurfaceViewSize(int width, int height) {
if (equalRate(width, height, 1.33f)) {
return "4:3";
} else {
return "16:9";
}
}
public boolean equalRate(int width, int height, float rate) {
float r = (float)width /(float) height;
if (Math.abs(r - rate) <= 0.2) {
return true;
} else {
return false;
}
}
根據解析度設定SurfaceView的大小:
/**
* 根據解析度設定預覽SurfaceView的大小以防止變形
*
* @param surfaceSize
*/
private void setSurfaceViewSize(String surfaceSize) {
ViewGroup.LayoutParams params = surfaceView.getLayoutParams();
if (surfaceSize.equals("16:9")) {
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
} else if (surfaceSize.equals("4:3")) {
params.height = 4 * screenWidth / 3;
}
surfaceView.setLayoutParams(params);
這樣基本就不會變形了,還有些手機可能既不是16:9也不是4:3 的螢幕解析度,都可以通過計算比例適當縮放使其不變形。
設定了previewSize和pictureSize,但是通過打Log看出當時設定的時候解析度是改變了的,然而正是拍照的時候解析度又變回系統預設的了,在不同的機子上預設的解析度不同。setParameters failed 問題我的華為的預設的previewSize是最高的,然而pictureSize又是最低的,導致預覽的圖片十分清晰,而拍出的照片十分小且模糊。同樣使用預設解析度,在一些機子上會出現預覽變形的情況。