Android SurfaceView內容獲取


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!

 

參考:http://stackoverflow.com/questions/3338235/bitmapfactory-decodebytearray-is-returning-null/7536405#7536405


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM