Android 自定義相機(jī) Camera 預(yù)覽變形拉伸問題

前幾天遇到一個需求拍攝省份證需要加一個框,需要自定義一個瀏覽頁面,我就自定義了一下相機(jī)發(fā)現(xiàn)拍攝預(yù)覽的時候圖像是變形的,我就各種查找解決方案,自定義相機(jī)步驟我就不說了,直接說說我怎么解決的:

首先要想不變形拉伸要保證三點一定要一樣:
1.預(yù)覽View的尺寸;
2.選取合適的預(yù)覽分辨率;

List<Camera.Size> pictureSizeList = parameters.getSupportedPictureSizes();

3.選取相機(jī)支持的圖片尺寸;

List<Camera.Size> previewSizeList = parameters.getSupportedPreviewSizes();

上面兩個方法返回大致是如下:
后補(bǔ)。。。

其實理解這個后大家就可以自己想合適的解決方案,目前我有兩種解決方案:

方法一 :這個方案簡單粗暴,我們市面上所有手機(jī)基本都會支持兩種分辨率4:3 / 16:9,我所瀏覽的區(qū)域選取4:3方法如下:

  • 先設(shè)置好View寬高比是4:3
int windWidth = DensityUtils.getWindWidth(context);//我這里獲取屏幕寬度
int mScreenWidth = windWidth;//預(yù)覽View寬度
int mScreenHeight = windWidth / 3 * 4;//預(yù)覽View高度
   /**從列表中選取合適的分辨率*/
   //拍攝尺寸
   Camera.Size picSize = getProperSize(pictureSizeList, ((float) height / width));
    if (null == picSize) {
      picSize = parameters.getPictureSize();
    }
    parameters.setPictureSize(picSize.width, picSize.height);
  //預(yù)覽
   Camera.Size preSize = getProperSize(previewSizeList, ((float) height) / width);
    if (null != preSize) {
     parameters.setPreviewSize(preSize.width, preSize.height);
    }

    /**
     * 從列表中選取合適的分辨率
     */
    private Camera.Size getProperSize(List<Camera.Size> pictureSizeList, float screenRatio) {
//        Log.i(TAG, "screenRatio=" + screenRatio);
        Collections.sort(pictureSizeList, new SizeL2hComparator());
        Camera.Size result = null;
        for (Camera.Size size : pictureSizeList) {
            float currentRatio = ((float) size.width) / size.height;
            if (currentRatio == screenRatio && size.width >= 640) {//此處加了一個圖片分辨率限制根據(jù)情況而定
//                LogsUtil.d("<-------->1>" + size.width + "<-------->" + size.height);
//                ToastUtils.toastShort("<-------->1>" + size.width + "<-------->" + size.height);
                result = size;
                break;
            }
        }

//由于傳入比例已經(jīng)做過限制下面代碼可有可無
        if (null == result) {
            for (Camera.Size size : pictureSizeList) {
                float curRatio = ((float) size.width) / size.height;
                if (curRatio == 4f / 3 && size.width >= 640) {
//                    LogsUtil.d("<-------->2>" + size.width + "<-------->" + size.height);
//                    ToastUtils.toastShort("<-------->2>" + size.width + "<-------->" + size.height);
                    result = size;
                    break;
                }
            }
        }
        return result;
    }

    /**
     * 從小到大排序
     */
    private static class SizeL2hComparator implements Comparator<Camera.Size> {
        @Override
        public int compare(Camera.Size size1, Camera.Size size2) {
            if (size1.width > size2.width) {
                return -1;
            } else if (size1.width < size2.width) {
                return 1;
            }
            return 0;
        }
    }
以上方法可以解決預(yù)覽變形拉伸問題,但是有4:3比例局限性;

方法二 :目前提供一下思路后續(xù)具體提供內(nèi)容;
此方法就是算出需求比例最相近的尺寸使用,然后設(shè)置預(yù)覽View寬高,如有其他好的方案希望可以共同學(xué)習(xí)一下;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容