zoukankan      html  css  js  c++  java
  • Android多媒体应用开发-控制摄像头拍照

    现在的手机的功能可谓是五花八门,手机照相功能就是特别突出的一点,现在的手机照相机甚至成了专业数码照相机,可以拍摄出清晰的照片和录制高分辨率的视频。Android操作系统呢,提供了相应的功能来控制拍照:

    通过Camera进行拍照

    1.调用Camera的open()方法打开相机。

    2.调用Camera的setParameters()方法获取拍照参数。该方法返回一个Camera.Parameters对象。

    3.调用Camera.Paramers对象方法设置拍照参数

    4.调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPreViewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片。

    5.调用Camera的takePicture()方法进行拍照.

    6.结束程序时,调用Camera的StopPriview()结束取景预览,并调用release()方法释放资源.

    创建项目:CaptureImage

    运行效果:

    程序代码:

    ==>CaptureImage.java

    1. package org.wwj.sound;  
    2.   
    3. import java.io.File;  
    4. import java.io.FileOutputStream;  
    5. import java.io.IOException;  
    6.   
    7. import android.app.Activity;  
    8. import android.app.AlertDialog;  
    9. import android.content.Context;  
    10. import android.content.DialogInterface;  
    11. import android.content.DialogInterface.OnClickListener;  
    12. import android.graphics.Bitmap;  
    13. import android.graphics.Bitmap.CompressFormat;  
    14. import android.graphics.BitmapFactory;  
    15. import android.graphics.PixelFormat;  
    16. import android.hardware.Camera;  
    17. import android.hardware.Camera.PictureCallback;  
    18. import android.os.Bundle;  
    19. import android.os.Environment;  
    20. import android.view.Display;  
    21. import android.view.KeyEvent;  
    22. import android.view.SurfaceHolder;  
    23. import android.view.SurfaceHolder.Callback;  
    24. import android.view.SurfaceView;  
    25. import android.view.View;  
    26. import android.view.Window;  
    27. import android.view.WindowManager;  
    28. import android.widget.EditText;  
    29. import android.widget.ImageView;  
    30.   
    31. public class CaptureImage extends Activity  
    32. {  
    33.     SurfaceView sView;  
    34.     SurfaceHolder surfaceHolder;  
    35.     int screenWidth, screenHeight;  
    36.     // 定义系统所用的照相机   
    37.     Camera camera;  
    38.     //是否在浏览中   
    39.     boolean isPreview = false;  
    40.     @Override  
    41.     public void onCreate(Bundle savedInstanceState)  
    42.     {  
    43.         super.onCreate(savedInstanceState);  
    44.         // 设置全屏   
    45.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
    46.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
    47.             WindowManager.LayoutParams.FLAG_FULLSCREEN);  
    48.         setContentView(R.layout.main);  
    49.         WindowManager wm = (WindowManager) getSystemService(  
    50.             Context.WINDOW_SERVICE);  
    51.         Display display = wm.getDefaultDisplay();  
    52.         // 获取屏幕的宽和高   
    53.         screenWidth = display.getWidth();  
    54.         screenHeight = display.getHeight();  
    55.         // 获取界面中SurfaceView组件   
    56.         sView = (SurfaceView) findViewById(R.id.sView);  
    57.         // 获得SurfaceView的SurfaceHolder   
    58.         surfaceHolder = sView.getHolder();  
    59.         // 为surfaceHolder添加一个回调监听器   
    60.         surfaceHolder.addCallback(new Callback()  
    61.         {  
    62.             public void surfaceChanged(SurfaceHolder holder, int format, int width,  
    63.                 int height)  
    64.             {  
    65.             }  
    66.             public void surfaceCreated(SurfaceHolder holder)  
    67.             {  
    68.                 // 打开摄像头   
    69.                 initCamera();  
    70.             }  
    71.             public void surfaceDestroyed(SurfaceHolder holder)  
    72.             {  
    73.                 // 如果camera不为null ,释放摄像头   
    74.                 if (camera != null)  
    75.                 {  
    76.                     if (isPreview)  
    77.                         camera.stopPreview();  
    78.                     camera.release();  
    79.                     camera = null;  
    80.                 }  
    81.             }         
    82.         });  
    83.         // 设置该SurfaceView自己不维护缓冲       
    84.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
    85.     }  
    86.   
    87.     private void initCamera()  
    88.     {  
    89.         if (!isPreview)  
    90.         {  
    91.             camera = Camera.open();  
    92.         }  
    93.         if (camera != null && !isPreview)  
    94.         {  
    95.             try  
    96.             {  
    97.                 Camera.Parameters parameters = camera.getParameters();  
    98.                 // 设置预览照片的大小   
    99.                 parameters.setPreviewSize(screenWidth, screenHeight);  
    100.                 // 每秒显示4帧   
    101.                 parameters.setPreviewFrameRate(4);  
    102.                 // 设置图片格式   
    103.                 parameters.setPictureFormat(PixelFormat.JPEG);  
    104.                 // 设置JPG照片的质量   
    105.                 parameters.set("jpeg-quality"85);  
    106.                 //设置照片的大小   
    107.                 parameters.setPictureSize(screenWidth, screenHeight);  
    108.                 camera.setParameters(parameters);  
    109.                 //通过SurfaceView显示取景画面   
    110.                 camera.setPreviewDisplay(surfaceHolder);  
    111.                 // 开始预览   
    112.                 camera.startPreview();  
    113.                 // 自动对焦   
    114.                 camera.autoFocus(null);  
    115.             }  
    116.             catch (Exception e)  
    117.             {  
    118.                 e.printStackTrace();  
    119.             }  
    120.             isPreview = true;  
    121.         }  
    122.     }  
    123.       
    124.     @Override  
    125.     public boolean onKeyDown(int keyCode, KeyEvent event)  
    126.     {  
    127.         switch (keyCode)  
    128.         {  
    129.             // 当用户单击照相键、中央键时执行拍照   
    130.             case KeyEvent.KEYCODE_DPAD_CENTER:  
    131.             case KeyEvent.KEYCODE_CAMERA:  
    132.                 if (camera != null && event.getRepeatCount() == 0)  
    133.                 {  
    134.                     // 拍照   
    135.                     camera.takePicture(nullnull , myjpegCallback);  
    136.                     return true;  
    137.                 }  
    138.                 break;  
    139.         }         
    140.         return super.onKeyDown(keyCode, event);  
    141.     }  
    142.       
    143.     PictureCallback myjpegCallback = new PictureCallback()  
    144.     {  
    145.         public void onPictureTaken(byte[] data, Camera camera)  
    146.         {  
    147.             // 根据拍照所得的数据创建位图   
    148.             final Bitmap bm = BitmapFactory.decodeByteArray(data  
    149.                 , 0, data.length);  
    150.             // 加载/layout/save.xml文件对应的布局资源   
    151.             View saveDialog = getLayoutInflater().inflate(  
    152.                 R.layout.save, null);  
    153.             final EditText photoName = (EditText) saveDialog  
    154.                 .findViewById(R.id.photo_name);  
    155.             // 获取saveDialog对话框上的ImageView组件   
    156.             ImageView show = (ImageView) saveDialog.findViewById(R.id.show);  
    157.             // 显示刚刚拍得的照片   
    158.             show.setImageBitmap(bm);  
    159.             //使用对话框显示saveDialog组件   
    160.             new AlertDialog.Builder(CaptureImage.this)  
    161.                 .setView(saveDialog)  
    162.                 .setPositiveButton("保存"new OnClickListener()  
    163.                 {  
    164.                     public void onClick(DialogInterface dialog,  
    165.                         int which)  
    166.                     {  
    167.                         // 创建一个位于SD卡上的文件   
    168.                         File file = new File(Environment.getExternalStorageDirectory()  
    169.                             ,  photoName.getText().toString() + ".jpg");  
    170.                         FileOutputStream outStream = null;  
    171.                         try  
    172.                         {  
    173.                             // 打开指定文件对应的输出流   
    174.                             outStream = new FileOutputStream(file);  
    175.                             // 把位图输出到指定文件中   
    176.                             bm.compress(CompressFormat.JPEG, 100, outStream);  
    177.                             outStream.close();  
    178.                         }  
    179.                         catch (IOException e)  
    180.                         {  
    181.                             e.printStackTrace();  
    182.                         }  
    183.                     }  
    184.                 })  
    185.                 .setNegativeButton("取消"null)  
    186.                 .show();  
    187.             //重新浏览   
    188.             camera.stopPreview();  
    189.             camera.startPreview();  
    190.             isPreview = true;  
    191.         }  
    192.     };  
    193. }  

    设置权限:

    1. <!-- 授予程序使用摄像头的权限 -->  
    2.     <uses-permission android:name="android.permission.CAMERA" />   
    3.     <uses-feature android:name="android.hardware.camera" />   
    4.     <uses-feature android:name="android.hardware.camera.autofocus" />
  • 相关阅读:
    动手学深度学习 | 单机多卡并行 | 32
    动手学深度学习 | 深度学习硬件:TPU和其他 | 31
    动手学深度学习 | 深度学习硬件:CPU和GPU | 30
    动手学深度学习 | ResNet为什么能训练出1000层的模型 | 28
    过滤器 filter
    JSP
    Servlet之会话 cookie session
    Servlet Response对象
    Servlet Request对象
    Http&Servlet
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3546760.html
Copyright © 2011-2022 走看看