首页 > 学院 > 开发设计 > 正文

自定义拍照

2019-11-08 00:28:20
字体:
来源:转载
供稿:网友

自定义拍照

拍照实现步骤:

 界面使用SurfaceView控件,显示照相机的画面

 SurfaceView接受摄像头界面变化的信息

 重写三个方法

保存

实现效果:

界面使用SurfaceView控件,显示照相机的画面

      布局文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"    android:layout_width="match_parent" android:layout_height="match_parent"    tools:context="com.example.p_.MainActivity"><SurfaceView    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/sfv_mian"    /><Button    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="拍照"    android:onClick="pz"    /></RelativeLayout>

SurfaceView接受摄像头界面变化的信息

//SurfaceView接受摄像头界面变化的信息        sfv_mian.getHolder().addCallback(new SurfaceHolder.Callback);//重写三个方法

重写三个方法

具体逻辑代码在三个方法中

 //预览界面被创建时,调用一般在这里打开照相机和设置照相机的一些参数            @Override            public void surfaceCreated(SurfaceHolder surfaceHolder) {                //开启摄像头(Camera.open()就是后面摄像头,可以填参数的可以设置前后摄像头)                camera = Camera.open();                //给摄像头设置参数                Camera.Parameters parameters = camera.getParameters();                // 设置每秒3栈                //parameters.setPictureFormat(3);                // 设置照片的输出格式                parameters.setPictureFormat(PixelFormat.JPEG);                // 设置照片的质量(第一个参数:是规定了的,                // 第二个参数:0-100(越大越质量好,但是是根据手机像素,设置85差不多))                parameters.set("jpeg-quality",85);                // 给照相机设置参数                camera.setParameters(parameters);                //将摄像头的画面显示到SurfaceView控件上                try {                    camera.setPReviewDisplay(sfv_mian.getHolder());                    // 开始预览                    camera.startPreview();                } catch (IOException e) {                    e.printStackTrace();                }            }            //当预览界面的格式和大小发生改变时,触发            @Override            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {            }            //当预览界面关闭时,触发 一般在这里执行销毁照相机的操作,释放内存            @Override            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {            }        });

保存

   当然保存要将字节转成Bitmap

                        //第一个参数:快门,第二个参数存放raw文件下,第三个参数想存到那就到那       camera.takePicture(null, null, new Camera.PictureCallback() {           @Override           public void onPictureTaken(byte[] bytes, Camera camera) {               //将字节改变成图片               //压缩               Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);               try {                   FileOutputStream fileOutputStream=new FileOutputStream("/mnt/sdcard/DCIM/王琰"+System.currentTimeMillis()+".png");                   bitmap.compress(Bitmap.CompressFormat.PNG,85,fileOutputStream);                   //停止                   camera.stopPreview();                   //重新拍照                   camera.startPreview();               }catch (Exception e){               }           }       });

添加权限(清单文件)

第一个权限是照相机的权限

第二个权限是获取写文件的权限

<uses-permission android:name="android.permission.CAMERA" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表