0

我在通过安卓相机拍照时遇到了一些问题。

主要目的是使用CameraControlView预览相机并通过按钮拍照。

String fileName = Environment.getExternalStorageDirectory().getPath() + "/sample_picture.jpg";
    Bitmap photo;
    mOpenCvCameraView.takePicture(fileName);
    //viewNavi.setDisplayedChild(viewNavi.indexOfChild(findViewById(R.id.image_view)));
    viewNavi.showNext();
    Bitmap newp =BitmapFactory.decodeFile(fileName);
    if(newp==null)
        return;

    ImageView imgViewResult = (ImageView) findViewById(R.id.imgViewResult);
    imgViewResult.setImageBitmap(newp);

CameraControlView.takePicture(fileLocation); 在那之后,我想在 imageView 上使用保存的图片,但我不能,因为保存图片进度尚未完成(由 运行OnPictureTaken)。所以我想确定拍照过程是否完成。然后我在互联网上找到了一个有用的解释,即OnPictureTaken进度是保存图片的负责方法:

public void onPictureTaken(byte[] data, Camera camera) {
        Log.i(TAG, "Saving a bitmap to file");
        // The camera preview was automatically stopped. Start it again.
        mCamera.startPreview();
        mCamera.setPreviewCallback(this);
        // Write the image in a file (in jpeg format)

        /*My code
        ImageView imgResult = (ImageView) findViewById(R.id.imgViewResult);
        Bitmap newp = BitmapFactory.decodeByteArray(data, 0, data.length);
        imgResult.setImageBitmap(newp);
        */

        try {
            FileOutputStream fos = new FileOutputStream(mPictureFileName);
            fos.write(data);
            fos.close();

        } catch (java.io.IOException e) {
            Log.e("PictureDemo", "Exception in photoCallback", e);
        }
        isPictureTaken = true; 
    }

真正的问题是当我尝试添加此代码段时:

    ImageView imgResult = (ImageView) findViewById(R.id.imgViewResult);
    Bitmap newp = BitmapFactory.decodeByteArray(data, 0, data.length);
    imgResult.setImageBitmap(newp);

进入onPictureTaken如上图。我有一个NullPointerException.

有没有一种方法只能将拍摄的照片拍成位图,并且以同步的方式(意味着我一直使用的方式不适合我的项目。当我想在 takePicture 之后设置 ImageBitmap 时。代码发送给我之前拍摄的 pic [因为我我正在使用相同的保存位置并覆盖图片]或null)

任何解释都会很棒。

谢谢你的时间。

4

1 回答 1

0

我找到了一个完全不同的方式。我只是拍摄了camera_preview的最后一帧。因此,我不必处理我上面解释的先前问题。

 public class CameraControlActivity extends Activity implements CvCameraViewListener2, OnTouchListener


 public void onCameraViewStarted(int width, int height) {
    mGray = new Mat();
    mRgba = new Mat();
 }

public void onCameraViewStopped() {
    mGray.release();
    mRgba.release();
}

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    mGray = inputFrame.gray();
    mRgba = inputFrame.rgba();
    return mRgba;
}

最后在按钮点击事件中

    Bitmap img = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(mRgba, img);
    img = drawORBFeatures(img);
    imgViewResult.setImageBitmap(img);
    viewNavi.setDisplayedChild(viewNavi.indexOfChild(findViewById(R.id.image_view)));

我希望有人会发现这篇文章有用。因为在android上拍照时,我在网上找不到比这更简单的方法。还有很多讨论如何处理其他方法的副作用(拍照不保存或onPictureTaken方法的异常等)

于 2013-08-07T08:28:32.007 回答