Android的摄像头采集的位图 [英] Android camera capture bitmap

查看:112
本文介绍了Android的摄像头采集的位图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的Andr​​oid代码我有一个摄像头表面观课,当我告诉了preVIEW这台相机类是现场拍照现场,但我怎么可以创建创建相机当前帧的位图的函数?
因此,我可以从其他类捕获的位图。

任何指导,将pciated AP $ P $〜

这是我的相机类代码:

 进口android.content.Context;
进口android.hardware.Camera;
进口android.util.Log;
进口android.view.SurfaceHolder;
进口android.view.SurfaceView;
进口java.io.IOException异常;公共类CameraSurfaceView扩展SurfaceView实现SurfaceHolder.Callback {相机mCamera;
布尔是previewRunning = FALSE;CameraSurfaceView(上下文的背景下){
    超级(上下文);
    SurfaceHolder mHolder = getHolder();
    mHolder.addCallback(本);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}公共无效surfaceCreated(SurfaceHolder持有人){
    同步(本){
        mCamera = Camera.open();
        尝试{
            mCamera.set previewDisplay(支架);
        }赶上(IOException异常五){
            Log.e(照相机,mCamera.set previewDisplay(持有人););
        }
        mCamera.setDisplayOrientation(90);
        mCamera.start preVIEW();    }
}公共无效surfaceDestroyed(SurfaceHolder持有人){
    同步(本){
        尝试{
            如果(mCamera!= NULL){
                mCamera.stop preVIEW();
                为previewRunning = FALSE;
                mCamera.release();
            }
        }赶上(例外五){
            Log.e(照相机,e.getMessage());
        }
    }
}公共无效surfaceChanged(SurfaceHolder架,INT格式,诠释W,INT高){}}


解决方案

请注意,以下codeS是对于拍摄,其显示像素的图像,而不是为服用相机。这意味着,结果图像将给予的屏幕的实际像素大小的(即1080x768),相机应用的不是多万像素的高分辨率图像。如果你想利用作为摄像头的应用程序提供的图像,使用<一个href=\"http://developer.android.com/reference/android/hardware/Camera.html#takePicture(android.hardware.Camera.ShutterCallback,%20android.hardware.Camera.PictureCallback,%20android.hardware.Camera.PictureCallback)\"相对=nofollow> takePicture 方法。

为了捕捉到活的preVIEW图像 SurfaceView

 公共类CameraSurfaceView扩展SurfaceView实现SurfaceHolder.Callback {
    私有静态最后弦乐TAG =CameraSurfaceView;    私人SurfaceHolder mSurfaceHolder;
    私人相机mCamera = NULL;
    私人位图mBitmap;
    私人语境mContext;
    私人Camera.Parameters mParameters;
    私人字节[]的字节数组;
    私人列表&LT; Camera.Size&GT; mSupported previewSizes;
    私人Camera.Size米previewSize;    公共CameraSurfaceView(上下文的背景下){
        这(背景下,NULL);
    }    公共CameraSurfaceView(上下文的背景下,ATTRS的AttributeSet){
        这(背景下,ATTRS,0);
    }    公共CameraSurfaceView(上下文的背景下,ATTRS的AttributeSet,诠释defStyle){
        超(背景下,ATTRS,defStyle);
        mContext =背景;        尝试{
            mSurfaceHolder = getHolder();
            mSurfaceHolder.addCallback(本);
            mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        }赶上(例外五){
            e.printStackTrace();
        }
    }    @覆盖
    公共无效surfaceCreated(最终SurfaceHolder surfaceHolder){
        如果(mCamera == NULL){
            尝试{
                mCamera = Camera.open();
            }赶上(RuntimeException的忽略){
            }
        }        尝试{
            如果(mCamera!= NULL){
                窗口管理winManager =(窗口管理器)mContext.getSystemService(Context.WINDOW_SERVICE);
                mCamera.set previewDisplay(mSurfaceHolder);
            }
        }赶上(例外五){
            如果(mCamera!= NULL)
                mCamera.release();
            mCamera = NULL;
        }        如果(mCamera == NULL){
                返回;
        }其他{
            mCamera.set previewCallback(新相机。previewCallback(){
                @覆盖
                在previewFrame(字节[]字节,相机摄像头){公共无效
                    如果(mParameters == NULL)
                    {
                        返回;
                    }
                    的字节数组=字节;
                }
            });
        }        setWillNotDraw(假);
    }    @覆盖
    公共无效surfaceChanged(SurfaceHolder surfaceHolder,INT格式,诠释的宽度,高度INT){
        尝试{
            mParameters = mCamera.getParameters();            清单&LT;尺寸和GT; cameraSize = mParameters.getSupported previewSizes();
            米previewSize = cameraSize.get(0);            对于(规格:cameraSize){
                如果((* s.width s.height)GT;(M previewSize.width * M previewSize.height)){
                    米previewSize = S;
                }
            }            mParameters.set previewSize(M previewSize.width,男previewSize.height);
            mCamera.setParameters(mParameters);
            mCamera.start preVIEW();        }赶上(例外五){
            如果(mCamera!= NULL){
                mCamera.release();
                mCamera = NULL;
            }
        }
    }
    @覆盖
    公共无效surfaceDestroyed(SurfaceHolder surfaceHolder){
        如果(mCamera!= NULL){
            mCamera.set previewCallback(NULL);
            mCamera.stop preVIEW();
            mCamera.release();
            mCamera = NULL;
        }
    }    公共位图getBitmap(){
        尝试{
            如果(mParameters == NULL)
                返回null;            如果(M previewSize == NULL)
                返回null;            INT格式= mParameters.get previewFormat();
            YuvImage yuvImage =新YuvImage(字节数组,格式,男previewSize.width,男previewSize.height,NULL);
            ByteArrayOutputStream byteArrayOutputStream =新ByteArrayOutputStream();            RECT RECT =新的矩形(0,0,M previewSize.width,男previewSize.height);            yuvImage.com pressToJpeg(矩形,75,byteArrayOutputStream);
            BitmapFactory.Options选项=新BitmapFactory.Options();
            options.inPurgeable = TRUE;
            options.inInputShareable = TRUE;
            mBitmap = BitmapFactory.de codeByteArray的(byteArrayOutputStream.toByteArray(),0,byteArrayOutputStream.size(),选件);            byteArrayOutputStream.flush();
            byteArrayOutputStream.close();
        }赶上(IOException异常IOE){
            ioe.printStackTrace();
        }        返回mBitmap;
    }    公共相机getCamera的(){
        返回mCamera;
    }
}

In my android coding I have a camera surface view class, when I show the preview for this camera class it's a live camera scene, but how can I create a function that create a bitmap for the camera current frame? So I can get the captured bitmap from other class.

Any guidance will be appreciated~

This is my camera class coding:

import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;

public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {

Camera mCamera;
boolean isPreviewRunning = false;

CameraSurfaceView(Context context) {
    super(context);
    SurfaceHolder mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    synchronized(this) {
        mCamera = Camera.open();
        try {
            mCamera.setPreviewDisplay(holder);
        } catch (IOException e) {
            Log.e("Camera", "mCamera.setPreviewDisplay(holder);");
        }
        mCamera.setDisplayOrientation(90);
        mCamera.startPreview();

    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    synchronized(this) {
        try {
            if (mCamera!=null) {
                mCamera.stopPreview();
                isPreviewRunning=false;
                mCamera.release();
            }
        } catch (Exception e) {
            Log.e("Camera", e.getMessage());
        }
    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

}

}

解决方案

Note that below codes are for capturing image with its displayed pixels, not for taking camera. It means, the result image will give actual pixel size of the screen (ie, 1080x768), not multi-megapixel high resolution image of the Camera app. If you want to take an image as Camera app provided, use takePicture method.

In order to capture live preview image in SurfaceView,

public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    private static final String TAG = "CameraSurfaceView";

    private SurfaceHolder mSurfaceHolder;
    private Camera mCamera = null;
    private Bitmap mBitmap;
    private Context mContext;
    private Camera.Parameters mParameters;
    private byte[] byteArray;
    private List<Camera.Size> mSupportedPreviewSizes;
    private Camera.Size mPreviewSize;

    public CameraSurfaceView (Context context) {
        this(context, null);
    }

    public CameraSurfaceView (Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CameraSurfaceView (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mContext = context;

        try {
            mSurfaceHolder = getHolder();
            mSurfaceHolder.addCallback(this);
            mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceCreated(final SurfaceHolder surfaceHolder) {
        if (mCamera == null) {
            try {
                mCamera = Camera.open();
            } catch (RuntimeException ignored) {
            }
        }

        try {
            if (mCamera != null) {
                WindowManager winManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
                mCamera.setPreviewDisplay(mSurfaceHolder);
            }
        } catch (Exception e) {
            if (mCamera != null)
                mCamera.release();
            mCamera = null;
        }

        if (mCamera == null) {
                return;
        } else {
            mCamera.setPreviewCallback(new Camera.PreviewCallback() {
                @Override
                public void onPreviewFrame(byte[] bytes, Camera camera) {
                    if (mParameters == null)
                    {
                        return;
                    }
                    byteArray = bytes;
                }
            });
        }

        setWillNotDraw(false);
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
        try {
            mParameters = mCamera.getParameters();

            List<Size> cameraSize = mParameters.getSupportedPreviewSizes();
            mPreviewSize = cameraSize.get(0);

            for (Size s : cameraSize) {
                if ((s.width * s.height) > (mPreviewSize.width * mPreviewSize.height)) {
                    mPreviewSize = s;
                }
            }

            mParameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
            mCamera.setParameters(mParameters);
            mCamera.startPreview();

        } catch (Exception e) {
            if (mCamera != null) {
                mCamera.release();
                mCamera = null;
            }
        }
    }


    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        if (mCamera != null) {
            mCamera.setPreviewCallback(null);
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
    }

    public Bitmap getBitmap() {
        try {
            if (mParameters == null)
                return null;

            if (mPreviewSize == null)
                return null;

            int format = mParameters.getPreviewFormat();
            YuvImage yuvImage = new YuvImage(byteArray, format, mPreviewSize.width, mPreviewSize.height, null);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

            Rect rect = new Rect(0, 0, mPreviewSize.width, mPreviewSize.height);

            yuvImage.compressToJpeg(rect, 75, byteArrayOutputStream);
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPurgeable = true;
            options.inInputShareable = true;
            mBitmap = BitmapFactory.decodeByteArray(byteArrayOutputStream.toByteArray(), 0, byteArrayOutputStream.size(), options);

            byteArrayOutputStream.flush();
            byteArrayOutputStream.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

        return mBitmap;
    }

    public Camera getCamera() {
        return mCamera;
    }
}

这篇关于Android的摄像头采集的位图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆