zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    python学习笔记之小小购物车
    TestNg学习一
    网监利器镜像——原理配置篇
    改变人生的31个黄金思维
    培养人脉的106个技巧
    CIR,CBS,EBS,PIR,PBS傻傻分不清楚?看这里!—-揭秘令牌桶
    请别浪费你30岁前的时光,职场“35岁现象”
    VRRP主备备份配置示例—实现网关冗余备份
    关于JS的prototype
    使用 Bootstrap Typeahead 组件
  • 原文地址:https://www.cnblogs.com/zhanghang-BadCoder/p/6543210.html
Copyright © 2011-2022 走看看