读书人

Android之照相机

发布时间: 2012-08-30 09:55:54 作者: rapoo

Android之相机

??? 在Android中专门提供了Camera来处理相机相关的时间,Camera是一个专门用来连接和断开服务的类,Camera下面包括如下几个事件:

    Camera.AutoFocusCallback? 自动调焦功能Camera.ErrorCallback???????????错误信息扑捉Camera.parameters???????????? 相机的属性参数Camera.PictureCallback?????? 拍照、产生图片时触发Camera.ShutterCallback????? 快门设置Camera.Size???????????????????????? 图片的尺寸

??? 要在Android中使用相机服务很简单,Camera没有构造方法,我们要使用它直接通过open()方法来打开相机设备,然后通过Camera.Parameters对相机的一些属性进行设置,比如输出图片的格式,大小等。使用Camera科技型的操作,如下:

?? 方法????????????????????????????????????????????????????????????????????????说明

autoFocus???????????????????????????????????????????????????????????设置自动对焦

getParameters??????????????????????????????????????????????????? 得到相机的参数

open???????????????????????????????????????????????????????????????????启动相机服务

release??????????????????????????????????????????????????????????????? 释放Camera服务

setParameters??????????????????????????????????????????????????? 设置预览的参数

setPreviewDisplay??????????????????????????????????????????????设置预览

startpreview???????????????????????????????????????????????????????开始预览

stopPreview???????????????????????????????????????????????????????停止预览

takePicture???????????????????????????????????????????????????????? 拍照

??? 这里重点说明一下拍照的方法和使用,takepicture方法要实现3个回调函数,分别是:Camera.ShutterCallback(快门)和两个Camera.PictureCallback(图像数据)。这里我们在拍照之后要取得图像数据就需要实现Camera.PictureCallback的onPictureTaken方法。onPictureTaken中第一个参数就是图像数据,第二个参数则是相机。

??? 下面看一个通过相机拍照的例子,相机需要一个界面来预览当前的拍摄效果,这里可以使用SurfaceView类。

package com.yarin.android.Examples_07_06;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.PixelFormat;import android.hardware.Camera;import android.hardware.Camera.PictureCallback;import android.os.Bundle;import android.view.KeyEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.Window;public class Activity01 extends Activity{private PreviewmPreview;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);// Create our Preview view and set it as the content of our activity.mPreview = new Preview(this);setContentView(mPreview);}public boolean onKeyUp(int keyCode, KeyEvent event){switch (keyCode){case KeyEvent.KEYCODE_DPAD_CENTER:mPreview.takePicture();break;}return true;}}/* Preview-显示Preview */class Preview extends SurfaceView implements SurfaceHolder.Callback {    SurfaceHolder mHolder;    Camera mCamera;    Bitmap CameraBitmap;        Preview(Context context)     {        super(context);        mHolder = getHolder();        mHolder.addCallback(this);        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    }    public void surfaceCreated(SurfaceHolder holder)     {    /* 启动Camera */        mCamera = Camera.open();        try         {           mCamera.setPreviewDisplay(holder);        }         catch (IOException exception)         {        /* 释放mCamera */            mCamera.release();            mCamera = null;            // TODO: add more exception handling logic here        }    }    public void surfaceDestroyed(SurfaceHolder holder)     {    /* 停止预览 */        mCamera.stopPreview();        mCamera = null;    }        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)     {    /* 构建Camera.Parameters对相机的参数进行设置 */        Camera.Parameters parameters = mCamera.getParameters();        /* 设置拍照的图片格式 */        parameters.setPictureFormat(PixelFormat.JPEG);        /* 设置Preview的尺寸 */        parameters.setPreviewSize(320, 480);        /* 设置图像分辨率 */        //parameters.setPictureSize(320, 480);        /* 设置相机采用parameters */        mCamera.setParameters(parameters);        /* 开始预览 */        mCamera.startPreview();    }    /* 拍照片 */    public void takePicture()     {      if (mCamera != null)       {      mCamera.takePicture(null, null, jpegCallback);      }    }    /* 拍照后输出图片 */    private PictureCallback jpegCallback = new PictureCallback()     {      public void onPictureTaken(byte[] _data, Camera _camera)      {        // TODO Handle JPEG image data    CameraBitmap = BitmapFactory.decodeByteArray(_data, 0, _data.length);         File myCaptureFile = new File("/sdcard/camera1.jpg");        try        {          BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));          CameraBitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);          bos.flush();          bos.close();          /* 将拍到的图片绘制出来 */          Canvas canvas= mHolder.lockCanvas();          canvas.drawBitmap(CameraBitmap, 0, 0, null);          mHolder.unlockCanvasAndPost(canvas);                  }        catch (Exception e)        {        e.getMessage();        }      }    };}

?

1 楼 l_happytime 2011-11-28 。。。都是和书上一摸一样啊

读书人网 >Android

热点推荐