最近做了一个自定义的相机,拍照后自动添加自定义水印图片,并且在预览窗口的右下角显示出来。下面总结一下自定义相机的步骤
一、继承SurfaceHolder.Callback回调接口,实现重载的三个方法,初始化摄像头和预览框:
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
initCamera();
}
@Override
public void surfaceCreated(SurfaceHolder paramSurfaceHolder) {
try{
this.mCamera = Camera.open();
//this.mCamera.setDisplayOrientation(90);
//在顺时针方向的基础上获取旋转角度
int degrees = getDisplayOritation(getDispalyRotation(), getDefaultCameraId());
mCamera.setDisplayOrientation(degrees);//设置相机预览的旋转角度
this.mCamera.setPreviewDisplay(paramSurfaceHolder);//设置预览所要用的surfaces对象
return;
}catch (IOException localIOException){
this.mCamera.release();
this.mCamera = null;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
stopCamera();
if (this.mCamera != null)
{
this.mCamera.release();
this.mCamera = null;
}
}
二、创建Camera.AutoFocusCallback对象,实现调用mCamera.autoFocus(this.mAutoFocusCallback)这个方法时就能够自动拍照:
private Camera.AutoFocusCallback mAutoFocusCallback = new Camera.AutoFocusCallback(){
public void onAutoFocus(boolean paramBoolean, Camera paramCamera){
MainActivity.this.mCamera.takePicture(MainActivity.this.shutterCallback,
MainActivity.this.rawCallback, MainActivity.this.jpegCallback);
}
};
三、创建onAutoFocus方法中所需的三个对象,获取图片数据:
private Camera.ShutterCallback shutterCallback = new Camera.ShutterCallback(){
public void onShutter(){}
};
private Camera.PictureCallback rawCallback = new Camera.PictureCallback(){
public void onPictureTaken(byte[] paramArrayOfByte, Camera paramCamera){}
};
private Camera.PictureCallback jpegCallback = new Camera.PictureCallback(){
public void onPictureTaken(byte[] paramArrayOfByte, Camera paramCamera){
File pictureFile = MainActivity.this.getOutputMediaFile();
savePicture(pictureFile, paramArrayOfByte);
initCamera();
}
};
四、在PictureCallback对象中的重载方法中获取图像数据,在这里就能够对图像进行一系列操作,如:压缩,加水印等等,然后再初始化摄像头。
设置拍照按钮,在onclick方法中调用autoFocus方法:
private void takePicture(){
if (this.mCamera != null){
this.mCamera.autoFocus(this.mAutoFocusCallback);
}
}
这样一个自定义的相机就完成了,能够实现水印,压缩等功能。项目代码链接:自定义水印相机