如何在Java Android中从相机预览中获取字节数组?

4

我是一个完全的新手。在阅读了这个http://developer.android.com/guide/topics/media/camera.html之后,我已经成功地编写并理解了这段代码。 但是,现在我想要获取预览的字节数组,然后将其转换为位图。但我想要实时完成此操作,而不必强制将图片文件保存到存储器中。请帮帮我!以下是我的程序代码。

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context, Camera camera) {
    super(context);
    mCamera = camera;

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = getHolder();
    mHolder.addCallback(this);
    // deprecated setting, but required on Android versions prior to 3.0
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    // The Surface has been created, now tell the camera where to draw the preview.
    try {
        mCamera.setPreviewDisplay(holder);

        mCamera.startPreview();
    } catch (IOException e) {
        String TAG = null;
        Log.d(TAG, "Error setting camera preview: " + e.getMessage());
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // empty. Take care of releasing the Camera preview in your activity.
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // If your preview can change or rotate, take care of those events here.
    // Make sure to stop the preview before resizing or reformatting it.


    mCamera.setDisplayOrientation(90);
    // set preview size and make any resize, rotate or
    // reformatting changes here

    // start preview with new settings
    try {

        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();

    } catch (Exception e){
        String TAG = null;
        Log.d(TAG, "Error starting camera preview: " + e.getMessage());
    }
}
private PictureCallback mPicture = new PictureCallback(){

    @Override
    public void onPictureTaken(byte[] data, Camera camera)

    {
        // TODO: Implement this method

    }
};

同时,主要活动:

public class MainActivity extends Activity
{   private Camera mCamera;
private CameraPreview mPreview; 
int i;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);  
    mCamera = getCameraInstance();
    mPreview = new CameraPreview(this, mCamera);

    FrameLayout preview = (FrameLayout) findViewById(R.id.frame);
    preview.addView(mPreview);



} 
public static Camera getCameraInstance()
{
    Camera c = null;
    try
    {
        c = Camera.open();}
    catch (Exception e)
    { System.out.println("blamjjjh");}
    return c;
}
public void releasec(){
    mCamera.release();
}

@Override
protected void onStop()
{

    super.onStop();
    releasec();
}
}
1个回答

2

Android开发者文档中所述(您可能已经阅读过),在您的Activity中添加PictureCallback接口实现(请参见下面的示例)。此外,您可以使用BitmapFactory将传回的字节数组转换为Bitmap。然后您可以根据需要使用它。

注意: 我还建议您阅读此处的文档,以了解有关内存管理和位图处理的最佳实践,因为如果您操作位图,则可能会遇到OutOfMemory错误。

private PictureCallback mPicture = new PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

       //create a Bitmap from the byte array
       Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length);

       //use your Bitmap
    }
};

你需要将这个传递到你的相机实例中的takePicture()方法中,例如:
// Add a listener to the Capture button
Button captureButton = (Button) findViewById(id.button_capture);
captureButton.setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // get an image from the camera
            mCamera.takePicture(null, null, mPicture);
        }
    }
);

希望这能有所帮助!:-)

谢谢您的回答,但我认为您没有理解我的意图。我想在预览时直接进行实时处理,而不使用按钮来捕获照片然后再进行处理。我希望在显示预览时进行处理。更准确地说,我想在每次预览表面发生变化时拍照。 - Madalin
啊,好的,我的错。这肯定更复杂,所以我会等待其他人回答,除非在此期间我能想到一个答案。 - Andy B
1
是的,我已经解决了,我会在短时间内发布解决方案。(我现在无法发布) - Madalin
1
@Madalin,你同时发布了吗? - Lorenz
请查看此问题以获取更多澄清:https://dev59.com/z47da4cB1Zd3GeqP9zA6 - Madalin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接