zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    提高网站访问速度的34个方法
    ASP.NET MVC3学习笔记四(Controller)
    ASP.NET MVC3 读书笔记一(Razor视图)
    DataSet DataTable DataReader dataAdapter区别
    EF Code First(约定配置)
    asp.net中APPlication、Session和Cookie的区别
    ASP.NET MVC3 读书笔记三(数据注解Dataannotation和验证)
    一步步构建大型网站架构
    ASP.NET MVC3 读书笔记二(HtmlHelper)
    Sql 查询语句总结
  • 原文地址:https://www.cnblogs.com/error404/p/2866869.html
Copyright © 2011-2022 走看看