Android SurfaceView内容获取

本文介绍如何在Android应用中使用SurfaceView显示相机内容,并通过YuvImage压缩为JPEG格式,实现对相机预览帧的捕获及辅助线的绘制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://www.cnblogs.com/zhanghang-BadCoder/p/6543210.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值