• android关于获取摄像头帧数据转成图片


    第一部分:

    由于Android下摄像头预览数据只能  ImageFormat.NV21 格式的,所以解码时要经过一翻周折.

    Camera mCamera = Camera.open();
    Camera.Parameters p = mCamera.getParameters();
    p.setPreviewFormat(ImageFormat.NV21);
    /*这是唯一值,也可以不设置。有些同学可能设置成 PixelFormat 下面的一个值,其实是不对的,具体的可以看官方文档*/
    mCamera.setParameters(p);
    mCamera.startPreview();

    方式一:系统SDK2.2自带解码方式

        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {        
            Size size = camera.getParameters().getPreviewSize();        
            try{
                YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
                if(image!=null){
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
                    Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
                    stream.close();
                }
            }catch(Exception ex){
                Log.e("Sys","Error:"+ex.getMessage());
            }
        }

    代码很简单。就是把YUV数据转成 Bitmap 就行了,系统提供 YuvImage 类。

    方式二:人工解码方式

    public Bitmap rawByteArray2RGBABitmap2(byte[] data, int width, int height) {
            int frameSize = width * height;
            int[] rgba = new int[frameSize];
    
                for (int i = 0; i < height; i++)
                    for (int j = 0; j < width; j++) {
                        int y = (0xff & ((int) data[i * width + j]));
                        int u = (0xff & ((int) data[frameSize + (i >> 1) * width + (j & ~1) + 0]));
                        int v = (0xff & ((int) data[frameSize + (i >> 1) * width + (j & ~1) + 1]));
                        y = y < 16 ? 16 : y;
    
                        int r = Math.round(1.164f * (y - 16) + 1.596f * (v - 128));
                        int g = Math.round(1.164f * (y - 16) - 0.813f * (v - 128) - 0.391f * (u - 128));
                        int b = Math.round(1.164f * (y - 16) + 2.018f * (u - 128));
    
                        r = r < 0 ? 0 : (r > 255 ? 255 : r);
                        g = g < 0 ? 0 : (g > 255 ? 255 : g);
                        b = b < 0 ? 0 : (b > 255 ? 255 : b);
    
                        rgba[i * width + j] = 0xff000000 + (b << 16) + (g << 8) + r;
                    }
    
            Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            bmp.setPixels(rgba, 0 , width, 0, 0, width, height);
            return bmp;
        }
  • 相关阅读:
    生成二维码
    XML 基础应用
    C# 后台模拟请求一般处理程序
    json
    导出excel td格式设置
    发布IIS后 上传文件过大失败解决方案
    SQL Server 日期+4位流水号
    垮库操作
    触发器结合游标删除关联表数据
    我是到今天才懂得“放疗”是居里夫人发明的,你呢?
  • 原文地址:https://www.cnblogs.com/error404/p/2866869.html
Copyright © 2020-2023  润新知