日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Camera的使用(一) 读书笔记

發布時間:2025/3/8 Android 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Camera的使用(一) 读书笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址

https://blog.csdn.net/junzia/article/details/52301199

?

拍照步驟
1.添加權限
2.開啟相機時check一下是否有攝像頭
3.對預覽大小、照片大小和對焦方式進行設置;對相機預覽方向進行設置;
4.相機預覽前,必須設置預覽的承載;對預覽View大小進行設置
5.相機預覽時拍照,圖像回調,對拍照的結果進行裁剪,使圖片結果和預覽結果相同,對前攝像頭拍攝的結果還需要做對稱變換。

?

相機的控制類CameraKitKat源碼

public class CameraKitKat extends ACamera{private Camera camera;private SurfaceHolder holder;private float displayScale;public CameraKitKat(SurfaceView surfaceView) {super(surfaceView);init();}private void init(){holder=displayView.getHolder();}
  //獲得一個相機實例@Override
public void open(int type){
    //獲取預覽方向設置
int rotation=((WindowManager)displayView.getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
    //判斷相機是否開啟
if(!openCamera(type))return;
    //修改相機設置setParameters(camera,rotation);
    //設置正確的預覽方向setDisplayOrientation(camera,rotation);
    //設置預覽的承載,如果沒有這一步,相機無法開始預覽setPreviewDisplay(camera,holder);
    //開啟預覽camera.startPreview();}@Override
public void close(){camera.stopPreview();camera.release();}//調整SurfaceView的大小private void resizeDisplayView(){
    //獲得相機實例的默認設置Camera.Parameters parameters
=camera.getParameters();
    //將預覽View的Size和Camera的PreviewSize設置相同Camera.Size size
=parameters.getPreviewSize();
    //返回布局參數的引用FrameLayout.LayoutParams p
= (FrameLayout.LayoutParams) displayView.getLayoutParams();float scale=size.width/(float)size.height;displayScale=displayView.getHeight()/(float)displayView.getWidth();if(scale>displayScale){p.height= (int) (scale*displayView.getWidth());p.width=displayView.getWidth();}else{p.width= (int) (displayView.getHeight()/scale);p.height=displayView.getHeight();}Log.e("wuwang","-->"+size.width+"/"+size.height);Log.e("wuwang","--<"+p.height+"/"+p.width);displayView.setLayoutParams(p);displayView.invalidate();}
  //獲得當前設備的Camera個數,為0表示不支持攝像頭
private boolean checkCameraId(int cameraId){return cameraId>=0&&cameraId<Camera.getNumberOfCameras();}//相機使用第一步,打開相機,獲得相機實例private boolean openCamera(int cameraId){if(!checkCameraId(cameraId))return false;camera=Camera.open(cameraId);return true;}//相機使用第二步,設置相機實例參數//TODO :里面還存在問題,需要修改private void setParameters(Camera camera,int rotation){Camera.Parameters parameters=camera.getParameters();//PreviewSize設置為設備支持的最高分辨率final Camera.Size size=Collections.max(camera.getParameters().getSupportedPreviewSizes(),new Comparator<Camera.Size>() {@Overridepublic int compare(Camera.Size lhs, Camera.Size rhs) {return lhs.width*lhs.height-rhs.width*rhs.height;}});parameters.setPreviewSize(size.width,size.height);//PictureSize設置為和預覽大小最近的Camera.Size picSize=Collections.max(parameters.getSupportedPictureSizes(), new Comparator<Camera.Size>() {@Overridepublic int compare(Camera.Size lhs, Camera.Size rhs) {return (int) (Math.sqrt(Math.pow(size.width-rhs.width,2)+Math.pow(size.height-rhs.height,2))-Math.sqrt(Math.pow(size.width-lhs.width,2)+Math.pow(size.height-lhs.height,2)));}});parameters.setPictureSize(picSize.width,picSize.height);//如果相機支持自動聚焦,則設置相機自動聚焦,否則不設置if(parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_AUTO)){parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);}//設置顏色效果 // parameters.setColorEffect(Camera.Parameters.EFFECT_MONO);camera.setParameters(parameters);resizeDisplayView();}//相機使用第三步,設置相機預覽方向private void setDisplayOrientation(Camera camera,int rotation){if(rotation== Surface.ROTATION_0||rotation==Surface.ROTATION_180){camera.setDisplayOrientation(90);}else{camera.setDisplayOrientation(0);}}//相機使用第四步,設置相機預覽載體SurfaceHolderprivate void setPreviewDisplay(Camera camera,SurfaceHolder holder){try {camera.setPreviewDisplay(holder);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void measureSize(int width, int height) {super.measureSize(width, height);}
  //拍照@Override
public void takePicture() {super.takePicture();camera.takePicture(new Camera.ShutterCallback() {@Override
      //原始圖像數據回調
public void onShutter() {}}, new Camera.PictureCallback() {@Override
      //展示圖像數據的回調
public void onPictureTaken(byte[] data, Camera camera) {}}, new Camera.PictureCallback() {@Override
      //JPEG圖像數據的回調
public void onPictureTaken(byte[] data, Camera camera) {if(pictureCallback!=null){pictureCallback.onPictureTaken(data,displayScale);}}});} }


?

轉載于:https://www.cnblogs.com/hyating/p/9007731.html

總結

以上是生活随笔為你收集整理的Android Camera的使用(一) 读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。