1. 程式人生 > 其它 >Android 使用CameraX拍照,自動對焦,以及證件照剪下

Android 使用CameraX拍照,自動對焦,以及證件照剪下

技術標籤:AndroidandroidCameraX拍照對焦剪下

在這裡插入圖片描述

想看更多演算法題,可以掃描上方二維碼關注我微信公眾號“資料結構和演算法”,截止到目前我已經在公眾號中更新了500多道演算法題,其中部分已經整理成了pdf文件,截止到目前總共有800多頁(並且還會不斷的增加),可以在公眾號中回覆關鍵字“pdf”即可下載。


在Android中拍照最初使用的是Camera,現在基本上已經被廢棄了,然後就是Camera2,這個使用更靈活,但有一點複雜,然後就是CameraX了,這個使用起來更方便。我們先來看一下演示效果


在這裡插入圖片描述

他可以使用前置或者後置攝像頭拍照,自動對焦,也可以實現證件照並實現剪下

使用方式


在根目錄的buid.gradle檔案中新增

	allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}

然後在使用的module的buid.gradle中新增

  implementation 'com.github.sdwwld:CameraX:1.0.2'

使用方式很簡單,幾行程式碼即可

            new CameraParam.Builder()
                    .setActivity(this)
                    .
setTargetActivity(CameraActivity.class) .build();

當然如果不能滿足你的需求,還可以修改更多的屬性

            String cameraPath = Environment.getExternalStorageDirectory().getPath() + File.separator + "DCIM" + File.separator + "Camera";
            File cameraFolder = new File(cameraPath)
; if (!cameraFolder.exists()) { cameraFolder.mkdirs(); } SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); CameraParam mCameraParam = new CameraParam.Builder() .setActivity(this)//!!!引數必須要有 .setTargetActivity(CameraActivity.class)//!!!引數必須要有 .setFront(false)//是否是前置攝像頭,true是前置攝像頭,false是後置攝像頭 .setShowMask(true)//是否顯示裁剪區,如果顯示,圖片會進行裁剪 .setShowSwitch(true)//是否顯示攝像頭切換按鈕,如果顯示,可以點選切換前後攝像頭 .setSwitchLeft(Tools.dp2px(this, 40))//攝像頭切換按鈕到螢幕左邊的距離 .setSwitchTop(Tools.dp2px(this, 40))//攝像頭切換按鈕到螢幕上邊的距離 .setSwitchSize(Tools.dp2px(this, 40))//攝像頭切換按鈕的大小(寬高一樣,是正方形的) .setBackText("返回")//下面返回鍵顯示的文字 .setBackColor(Color.WHITE)//下面返回鍵的顏色 .setBackSize(16)//下面返回鍵的尺寸 .setBackLeft(Tools.dp2px(this, 10))//返回鍵到螢幕左邊的距離 .setTakePhotoSize(Tools.dp2px(this, 60))//拍照按鈕的大小(還有拍照完之後顯示的儲存和放棄儲存的按鈕,這3個按鈕的大小是一樣的) .setMaskMarginLeftAndRight(Tools.dp2px(this, 20))//如果顯示裁剪框,裁剪框左右兩邊倒螢幕的距離 .setMaskMarginTop(Tools.dp2px(this, 120))如果顯示裁剪框,裁剪框到螢幕上邊的距離 .setMaskRatioW(8)//下面一行和當前行表示的是裁剪框的寬高比 .setMaskRatioH(5) .setResultBottom(Tools.dp2px(this, 60))//拍照按鈕到螢幕下邊的距離(還有拍照完之後顯示的儲存和放棄儲存的按鈕) .setResultLeftAndRight(Tools.dp2px(this, 60))//拍照完之後顯示的儲存和放棄儲存的按鈕到左邊和右邊的距離 .setSwitchImgId(R.drawable.ic_switch)//切換攝像頭的按鈕 .setMaskImgId(R.drawable.bg_bankcard)//剪下框 .setSaveImgId(R.mipmap.success)//拍照成功之後的儲存按鈕 .setCancelImgId(R.mipmap.failed)//拍照成功之後的放棄按鈕 .setTakePhotoImgId(R.mipmap.take_button)//拍照按鈕 .setPicturePath(cameraFolder.getAbsolutePath() + File.separator + "IMG_" + simpleDateFormat.format(new Date()) + ".jpg")//拍照儲存的路徑 .setShowFocusTips(true)//點選螢幕聚焦成功的時候是否需要提示 .setFocusFailTips("聚焦失敗")//聚焦失敗的提示 .setFocusSuccessTips("聚焦成功")//聚焦成功的提示 .setFocusViewTime(3)//聚焦的時間,是秒 .setFocusViewColor(ContextCompat.getColor(this, R.color.blue))//聚焦框的顏色 .setFocusViewSize(Tools.dp2px(this, 60))//聚焦框的大小(正方形的) .setCornerViewSize(Tools.dp2px(this, 12))//聚焦框的圓角大小 .setFocusViewStrokeSize(Tools.dp2px(this, 2))//聚焦框線條寬度 .setRequestCode(CameraConstant.REQUEST_CODE)//請求碼 .build(); //前兩個引數是必須要有的,後面的引數不是必須的,如果想獲取預設引數可以像下面這樣 Log.d("wld______", mCameraParam.getPicturePath());

至於檔案的獲取路徑可以使用下面的方式

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //requestCode預設是CameraConstant.REQUEST_CODE ,當然也可以在上面的CameraParam建立的時候
        //呼叫setRequestCode修改
        if (requestCode == CameraConstant.REQUEST_CODE && resultCode == RESULT_OK) {
            //獲取圖片路徑
            String picturePath = data.getStringExtra(CameraConstant.PICTURE_PATH_KEY);
            //顯示出來
            img_picture.setVisibility(View.VISIBLE);
            img_picture.setImageBitmap(BitmapFactory.decodeFile(picturePath));
        }
    }

具體專案demo可以到github上下載。