Camera类如何拍照并返回byte[]?

解决方案 »

  1.   

    Camera.PictureCallback中的onPictureTaken(byte[] data, Camera camera),第一个参数就是图片数据
      

  2.   

    能再详细点?通过Intent传递?
      

  3.   

    /**
    * 拍照的回调接口
    */
    PictureCallback mPictureCallback = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
    Log.v(“PictureCallback”, “…onPictureTaken…”);
    if (data != null) {
    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
    data.length);
    mImageView.setImageBitmap(bitmap);
    mImageView.setVisibility(View.VISIBLE);
    mSurfaceView.setVisibility(View.GONE);
    if (mPreviewRunning) {
    mCamera.stopPreview();
    mPreviewRunning = false;
    }
    }
    }
    };
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiongyingzhuantu/archive/2010/12/11/6069454.aspx
      

  4.   


    谢谢提示,我想实现“比较连拍的两张图片的变化”,是不是每次都要把图片数据put到Intent中,然后通过程序获取出来进行比较处理?
      

  5.   

    我想获取Preview的数据为什么
    public void onPreviewFrame(byte[] data, Camera camera) {}
    代码一直没有被执行?PreviewCallback我已经设置了。
      

  6.   

    用takepicture处理我试了速度太慢,如何才能用
    public void onPreviewFrame(byte[] data, Camera camera) {}
    来动态处理每一帧数据?
      

  7.   

    返回的那个byte[] 如何转化成bitmap啊 ? 那个byte里的数据时如何存放的啊 ? 有什么规律呢 ?
    比如一个像素点是顺序排放在byte[1]  byte[2] byte[3] 这样排放的吗 ?
      

  8.   

    问题已解决,发现public void onPreviewFrame(byte[] data, Camera camera) {}并不是所有机器都支持,我用的MID就不行。而且不同机器支持的data格式也不尽相同,例如moto里程碑就很标准,支持的是NV25.有点机器就是别的格式。
      

  9.   

    你把下面这个类设置成Activity的ContentView/**
         * The camera preview control.
         */
        class Preview extends SurfaceView implements SurfaceHolder.Callback 
        {
            /**
             * Display surface holder.
             */
            private SurfaceHolder m_holder;        /**
             * The camera object.
             */
            private Camera        m_camera;        /**
             * The process running context.
             */
            private TakePhoto     m_context;        /**
             * Constructor.
             * 
             * @param context
             */
            Preview(Context context) 
            {
                super(context);
                m_context = (TakePhoto) context;            m_holder = getHolder();
                m_holder.addCallback(this);
                m_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            }        /**
             * This is called immediately after the surface is first created.
             * 
             * @param holder   The surface to display.
             */
            @Override
            public void surfaceCreated(SurfaceHolder holder) 
            {
                // start camera.
                m_camera = Camera.open();
                try 
                {
                    m_camera.setPreviewDisplay(holder);
                } 
                catch (IOException exception) 
                {
                    m_camera.release();
                    m_camera = null;
                }
            }        /**
             * This is called immediately before a surface is being destroyed.
             * 
             * @param holder   The surface to destroy.
             */
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) 
            {
                m_camera.stopPreview();
                m_camera.release();
                m_camera = null;
            }        /**
             * This is called immediately after any structural changes (format or size) 
             * have been made to the surface.
             * 
             * @param holder   The surface to display.
             *        format   The format of the picture.
             *        w        The width of the holder.
             *        h        The height of the holder.
             */
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) 
            {
                Camera.Parameters parameters = m_camera.getParameters();
                parameters.setPictureFormat(PixelFormat.JPEG);
                parameters.setPreviewSize(getWidth(), getHeight());
                m_camera.setParameters(parameters);
                m_camera.startPreview();
            }        /**
             * Taking photo.
             */
            public void takePicture() 
            {
                if (m_camera != null) 
                {
                    m_camera.takePicture(null, null, jpegCallback);
                }
            }        /**
             * Output photos after taking.
             */
            private PictureCallback jpegCallback = new PictureCallback() 
            {
                public void onPictureTaken(byte[] _data, Camera _camera) 
                {
                     // 这里的_data就是你要的图片数据啦
                }
            };
        }然后在按键的响应事件中调用takePicture()即可
      

  10.   

    问一下,byte[] data 有可能为空吗?