1. 程式人生 > >Android Camera開發解析度 清晰度 影象變形

Android Camera開發解析度 清晰度 影象變形

設定了previewSize和pictureSize:
但是通過打Log看出當時設定的時候解析度是改變了的,然而正是拍照的時候解析度又變回系統預設的了,在不同的機子上預設的解析度不同。
setParameters failed 問題我的華為的預設的previewSize是最高的,然而pictureSize又是最低的:
致預覽的圖片十分清晰,而拍出的照片十分小且模糊。
同樣使用預設解析度,在一些機子上會出現預覽變形的情況 

1.設定預覽分辨路和圖片解析度:

Camera.Parameters param = camera.getParameters();
param.setPreviewSize(width, height); //width一般大於height

     setParameters failed問題解決:
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又是最低的,導致預覽的圖片十分清晰,而拍出的照片十分小且模糊。同樣使用預設解析度,在一些機子上會出現預覽變形的情況。