学习Camera 好久了一直都想发个博客什么的 到底 还是没那种思想,今天写了一点东西 故发出来 ,其实有很多问题,但是基本上可以使用了,所以发到这里 ,记录一下。
1: 连拍 其实 没有真正的实现连拍,所谓的没有真正实现,其实根本没有快门事件发生,如果想要快门其实可以用soundPool 在假拍照的时候播放声音,关于这一点我没有实现。
2,:所谓的画中画,其实就是将预览的图片处理一下然后传到一个自己定义的surfaceview中画出来。
贴一下主要代码
class JpegPreviewCallback implements PreviewCallback {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
//Toast.makeText(getApplicationContext(), "take", 0).show();
final byte[] yuvdata = data;
if(mSVDrawtime == 1){
mSvDraw.drawPicture(data,mCamera.getParameters().getPreviewSize());
}else{
mSVDrawtime = (mSVDrawtime+1)%3;
}
// Thread save = new Thread(new Runnable() {
// @Override
// public void run() {
// Log.v(TAG,"save jpeg size"+yuvdata.length);
// fileName = System.currentTimeMillis() + ".jpeg";
// boolean mIsSave = Storage.savePicture(yuvdata, fileName,
// mCamera.getParameters().getPreviewSize(),
// pictureOrientation);
// if(!mIsSave){
// Log.v(TAG,"save fail");
// }
// }
// });
// save.start();
// mCamera.setPreviewCallback(null);
}
}
那个mSvDraw.drawPicture 是实现画中画的
下面的那个Thread 是用于存储的
里面的Storage.savePicture 主要负责存储 YUV 数据变为JPG 图片
该函数主要完成 画中画中 将YUV 转换为canvas 然后post 显示出来 代码很幼稚 只是记录一下学习过程
public void drawPicture(byte[] data,Size previewSize){
mWidth = getWidth();
mHeight = getHeight();
Canvas canvas = mSurfaceHolder.lockCanvas();
//canvas.
canvas.drawColor(Color.TRANSPARENT);
ByteArrayOutputStream out = new ByteArrayOutputStream();
YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, previewSize.width,previewSize.height, null);
yuvImage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 50, out);
byte[] imageBytes = out.toByteArray();
Bitmap image = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
Matrix matrix=new Matrix();
matrix.postScale(0.2f, 0.2f);
matrix.postRotate(90);
Bitmap dstbmp=Bitmap.createBitmap(image,0,0,image.getWidth(),
image.getHeight(),matrix,true);
canvas.drawBitmap(dstbmp, 10, 10, null);
mSurfaceHolder.unlockCanvasAndPost(canvas);
}
下载地址:
http://download.csdn.net/detail/shen332401890/5169693