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 。。。都是和书上一摸一样啊