Android Camera的使用(一) 读书笔记
生活随笔
收集整理的這篇文章主要介紹了
Android Camera的使用(一) 读书笔记
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原文地址
https://blog.csdn.net/junzia/article/details/52301199
?
拍照步驟
1.添加權(quán)限
2.開(kāi)啟相機(jī)時(shí)check一下是否有攝像頭
3.對(duì)預(yù)覽大小、照片大小和對(duì)焦方式進(jìn)行設(shè)置;對(duì)相機(jī)預(yù)覽方向進(jìn)行設(shè)置;
4.相機(jī)預(yù)覽前,必須設(shè)置預(yù)覽的承載;對(duì)預(yù)覽View大小進(jìn)行設(shè)置
5.相機(jī)預(yù)覽時(shí)拍照,圖像回調(diào),對(duì)拍照的結(jié)果進(jìn)行裁剪,使圖片結(jié)果和預(yù)覽結(jié)果相同,對(duì)前攝像頭拍攝的結(jié)果還需要做對(duì)稱變換。
?
相機(jī)的控制類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();}//獲得一個(gè)相機(jī)實(shí)例@Overridepublic void open(int type){
//獲取預(yù)覽方向設(shè)置int rotation=((WindowManager)displayView.getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
//判斷相機(jī)是否開(kāi)啟if(!openCamera(type))return;
//修改相機(jī)設(shè)置setParameters(camera,rotation);
//設(shè)置正確的預(yù)覽方向setDisplayOrientation(camera,rotation);
//設(shè)置預(yù)覽的承載,如果沒(méi)有這一步,相機(jī)無(wú)法開(kāi)始預(yù)覽setPreviewDisplay(camera,holder);
//開(kāi)啟預(yù)覽camera.startPreview();}@Overridepublic void close(){camera.stopPreview();camera.release();}//調(diào)整SurfaceView的大小private void resizeDisplayView(){
//獲得相機(jī)實(shí)例的默認(rèn)設(shè)置Camera.Parameters parameters=camera.getParameters();
//將預(yù)覽View的Size和Camera的PreviewSize設(shè)置相同Camera.Size size=parameters.getPreviewSize();
//返回布局參數(shù)的引用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();}
//獲得當(dāng)前設(shè)備的Camera個(gè)數(shù),為0表示不支持?jǐn)z像頭private boolean checkCameraId(int cameraId){return cameraId>=0&&cameraId<Camera.getNumberOfCameras();}//相機(jī)使用第一步,打開(kāi)相機(jī),獲得相機(jī)實(shí)例private boolean openCamera(int cameraId){if(!checkCameraId(cameraId))return false;camera=Camera.open(cameraId);return true;}//相機(jī)使用第二步,設(shè)置相機(jī)實(shí)例參數(shù)//TODO :里面還存在問(wèn)題,需要修改private void setParameters(Camera camera,int rotation){Camera.Parameters parameters=camera.getParameters();//PreviewSize設(shè)置為設(shè)備支持的最高分辨率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設(shè)置為和預(yù)覽大小最近的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);//如果相機(jī)支持自動(dòng)聚焦,則設(shè)置相機(jī)自動(dòng)聚焦,否則不設(shè)置if(parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_AUTO)){parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);}//設(shè)置顏色效果 // parameters.setColorEffect(Camera.Parameters.EFFECT_MONO);camera.setParameters(parameters);resizeDisplayView();}//相機(jī)使用第三步,設(shè)置相機(jī)預(yù)覽方向private void setDisplayOrientation(Camera camera,int rotation){if(rotation== Surface.ROTATION_0||rotation==Surface.ROTATION_180){camera.setDisplayOrientation(90);}else{camera.setDisplayOrientation(0);}}//相機(jī)使用第四步,設(shè)置相機(jī)預(yù)覽載體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);}
//拍照@Overridepublic void takePicture() {super.takePicture();camera.takePicture(new Camera.ShutterCallback() {@Override
//原始圖像數(shù)據(jù)回調(diào)public void onShutter() {}}, new Camera.PictureCallback() {@Override
//展示圖像數(shù)據(jù)的回調(diào)public void onPictureTaken(byte[] data, Camera camera) {}}, new Camera.PictureCallback() {@Override
//JPEG圖像數(shù)據(jù)的回調(diào)public void onPictureTaken(byte[] data, Camera camera) {if(pictureCallback!=null){pictureCallback.onPictureTaken(data,displayScale);}}});} }
?
轉(zhuǎn)載于:https://www.cnblogs.com/hyating/p/9007731.html
總結(jié)
以上是生活随笔為你收集整理的Android Camera的使用(一) 读书笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vscode插件的开发与发布流程
- 下一篇: nginx配置tomcat负载均衡,ng