public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
int i = 0, y = 0;
int uvp = 0, u = 0, v = 0;
int y1192 = 0, r = 0, g = 0, b = 0;
for (int j = 0, yp = 0; j < height; j++) {
uvp = frameSize + (j >> 1) * width;
u = 0;
v = 0;
for (i = 0; i < width; i++, yp++) {
y = (0xff & ((int) yuv420sp[yp])) - 16;
if (y < 0) y = 0;
if ((i & 1) == 0) {
v = (0xff & yuv420sp[uvp++]) - 128;
u = (0xff & yuv420sp[uvp++]) - 128;
}
y1192 = 1192 * y;
r = (y1192 + 1634 * v);
g = (y1192 - 833 * v - 400 * u);
b = (y1192 + 2066 * u);
if (r < 0) r = 0; else if (r > 262143) r = 262143;
if (g < 0) g = 0; else if (g > 262143) g = 262143;
if (b < 0) b = 0; else if (b > 262143) b = 262143;
android camera 源码分析(基于应用)
这里主要是针对Ophone进行介绍的,当然 结合了android的源码(以下出现均为android2.2源码)。
首先在Ophone中也是通过android.hardware.Camera类来控制摄像头设备的,要使用只有通过 android.hardware.Camera.open()来打开。 try { mCameraDevice = android.hardware.Camera.open(); }
catch (RuntimeException e) { Log.e(TAG, "fail to connect Camera", e);
throw new CameraHardwareException(e); }
另外Ophone还提供了一些接口来给予回调,控制Camera的状态,
分别是: 1.android.hardware.Camera.ErrorCallback:摄像头出错的时候调用,这个接口具有一个void onError(int error,Camera camera)函数;其中,
前者表示数据类型,取值是Camera类中的常量CAMERA_ERROR_UNKNOWN或者是 CAMERA_ERROR_SERVICE_DIED; 作者: abcd83 时间: 2012-8-22 11:31
前者是不明错误,后者是表示服务已经关闭,
在这种情况下需要释放当前的Camera对象,然后再初始化一个。
private static final class ErrorCallback implements android.hardware.Camera.ErrorCallback { public void onError(int error, android.hardware.Camera camera) { if (error == android.hardware.Camera.CAMERA_ERROR_SERVER_DIED) { mMediaServerDied = true; Log.v(TAG, "media server died"); } } }
2.android.hardware.camera.PreviewCallback:在图像预览时调用,这个接口有一个void onPreviewFrame(byte[] data,Camera camera);参数data为每帧图像的数据流。我们可以根据实际需要来实现这个接口。
3.android.hardware.Camera.ShutterCallback:在图像预览的时候调用,这个接口具有一个void onShutter();可以在改函数中通知用户快门已经关闭,例如播放一个声音。 private final class ShutterCallback implements android.hardware.Camera.ShutterCallback { public void onShutter() { mShutterCallbackTime = System.currentTimeMillis(); mShutterLag = mShutterCallbackTime - mCaptureStartTime; Log.v(TAG, "mShutterLag = " + mShutterLag + "ms"); clearFocusState(); } }
4.android.hardware.Camera.PictureCallback:当拍摄相片的时候调用,该接口具有一个void onPictureTaken(byte[] data,Camera camera)函数;参数和预览的一样。在android中主要有三个类实现了这个接口,分别是PostViewPictureCallback、 RawPictureCallback、JepgPictureCallback。我们可以根据需要定义自己需要的类。
5.android.hardware.Camera.AutoFocusCallback:当自动对焦时候调用,该接口具有一个void onAutoFocus(boolean focused,Camera camera)函数;
private final class AutoFocusCallback implements android.hardware.Camera.AutoFocusCallback { public void onAutoFocus(boolean focused, android.hardware.Camera camera) { mFocusCallbackTime = System.currentTimeMillis();
mAutoFocusTime = mFocusCallbackTime - mFocusStartTime; Log.v(TAG, "mAutoFocusTime = " + mAutoFocusTime + "ms");
if (mFocusState == FOCUSING_SNAP_ON_FINISH) { // Take the picture no matter focus succeeds or fails. No need // to play the AF sound if we're about to play the shutter // sound. if (focused) { mFocusState = FOCUS_SUCCESS; }
else { mFocusState = FOCUS_FAIL; } mImageCapture.onSnap(); }
else if (mFocusState == FOCUSING)
{ // User is half-pressing the focus key. Play the focus tone. // Do not take the picture now. ToneGenerator tg = mFocusToneGenerator; if (tg != null)
{ tg.startTone(ToneGenerator.TONE_PROP_BEEP2); }
if (focused) { mFocusState = FOCUS_SUCCESS; }
else { mFocusState = FOCUS_FAIL; } }
else if (mFocusState == FOCUS_NOT_STARTED)
{ // User has released the focus key before focus completes. // Do nothing. } updateFocusIndicator(); } }
6.还提供了放大缩小的监听器android.hardware.Camera.OnZoomChangeListener。
private final class ZoomListener implements android.hardware.Camera.OnZoomChangeListener { public void onZoomChange(int value, boolean stopped, android.hardware.Camera camera) { Log.v(TAG, "Zoom changed: value=" + value + ". stopped=" + stopped); mZoomValue = value; // Keep mParameters up to date. We do not getParameter again in // takePicture.
If we do not do this, wrong zoom value will be set. mParameters.setZoom(value);
// We only care if the zoom is stopped. mZooming is set to true when
// we start smooth zoom.
if (stopped && mZoomState != ZOOM_STOPPED)
{ if (value != mTargetZoomValue) { mCameraDevice.startSmoothZoom(mTargetZoomValue); mZoomState = ZOOM_START; }
else { mZoomState = ZOOM_STOPPED; } } } }
当取得照片的数据流后可以通过BitmapFactory的decodeByteArray()函数来解析图片。
另外还可以通过Camera对象的getParameters()函数来得到一个android.hardware.Camera.Parameters 对象,Parameters提供了一些接口来设置Camera的属性:
1.setPictureFormat(int pixel_format):设置图片的格式,其取值为PixelFormat YCbCr_420_SP、PixelFormatRGB_565或者PixelFormatJPEG。
2.setPreviewFormat(int pixel_format):设置图片的预览格式,取值如上。
3.setPictureSize(int width,int height):设置图片的高度和宽度,单位为像素。
4.setPreviewSize(int width,int height):设置预览的高度和宽度,取值如上。
5.setPreviewFrameRate(int fps):设置图片预览的帧速。 在设置好Camera的参数后,可以通过函数void startPreview()开始预览图像、void stopPreview()结束预览,通过autoFocus(AutoFocusCallback cb)来自动对焦,最后可以通过takePicture(ShutterCallback shutter, PictureCallback raw, PictureCallback jpeg)函数来拍照。
该函数有三个参数,分别为快门回调接口、原生图像数据接口和压缩格式图片数据接口。
如果数据格式不存在的话数据流为空,如果不需要实现这些接口则这些参数取值可以为null。