我通过Android相机拍照时遇到了一些问题。
主要目的是使用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之后设置setImageBitmap。代码发送给我之前拍摄的照片[因为我使用相同的保存位置并覆盖图片]或null)
任何解释都会很棒。
感谢您的时间。
答案 0 :(得分: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方法的异常等)有很多讨论。