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!