Android SurfaceView内容获取
这几天在做一个Android的小项目,项目中需要使用到SurfaceView来显示相机捕获的内容,同时还有一个SurfaceView用于绘制一些辅助线,最后要得到一张图,包含相机内容和用户编辑的辅助线。
用户的辅助线是相对比较好保存的,直接将操作在图片上进行,再将图片贴到SurfaceView上即可,使用如下代码:
SurfaceView mSurfaceView = (SurfaceView)findViewById(R.id.surface_view); Bitmap mLineBitmap = Bitmap.createBitmap(800, 480, Bitmap.Config.ARGB_8888); Canvas bitmapCanvas = new Canvas(mLineBitmap); Canvas canvas = mSurfaceView.getHolder.lockCanvas(); canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR); bitmapCanvas.drawColor(Color.TRANSPARENT, Mode.CLEAR); // draw line mAssistLine.DrawLine(bitmapCanvas); canvas.drawBitmap(mLineBitmap, 0, 0, null);
效果图:
但是想要将展示相机内容的SurfaceView中的相机内容捕获下来就不容易了。因为相机内容并不是使用Canvas绘制的。最后在网上找到了一个方法,代码如下:
sCamera.setOneShotPreviewCallback(new Camera.PreviewCallback() { public void onPreviewFrame(byte[] data, Camera camera) { if(data != null) { Size previewSize = sCamera.getParameters().getPreviewSize(); Log("previewSize: " + previewSize.height +"," + previewSize.width); YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvImage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 80, baos); byte[] jdata = baos.toByteArray(); Bitmap tmpBitmap = BitmapFactory.decodeByteArray( jdata, 0, jdata.length); if(tmpBitmap!=null) { mRvcBitmap = Bitmap.createScaledBitmap(tmpBitmap, 800, 480, false); if(!mRvcBitmap.equals(tmpBitmap)) { tmpBitmap.recycle(); tmpBitmap = null; } Log("get the frame bitmap"); camera.startPreview(); } else { Log("tmpBitmap is null" + sCamera.getParameters().getPictureFormat()); } } else { Log("data is null, jpge"); } } });
效果图:
一切伟大的思想和行动都一个微不足道的开始,Hello,world!