在相机对象上注册一个Camera.PreviewCallback并在onPreviewFrame回调方法中处理图像数据。此时,我们可以使用一个ByteBuffer对象来处理图像数据。由于这个ByteBuffer对象是复用的,所以我们需要根据需要进行适当的缩放和类型转换。这个ByteBuffer对象的容量取决于相机的预览大小,因此我们需要使用Camera.Parameters.getPreviewSize()方法来获取预览大小,并相应地计算出ByteBuffer对象的容量。
示例代码:
public class MyCameraPreview implements SurfaceHolder.Callback, Camera.PreviewCallback {
private Camera mCamera;
private SurfaceView mPreview;
private SurfaceHolder mHolder;
private ByteBuffer mBuffer;
public MyCameraPreview(Camera camera, SurfaceView preview) {
mCamera = camera;
mPreview = preview;
mHolder = mPreview.getHolder();
mHolder.addCallback(this);
mBuffer = ByteBuffer.allocate(camera.getParameters().getPreviewSize().width * camera.getParameters().getPreviewSize().height * ImageFormat.getBitsPerPixel(camera.getParameters().getPreviewFormat()) / 8);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(holder);
mCamera.setPreviewCallback(this);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters params = mCamera.getParameters();
List supportedSizes = params.getSupportedPreviewSizes();
Camera.Size optimalSize = getOptimalPreviewSize(supportedSizes, width, height);
params.setPreviewSize(optimalSize.width, optimalSize.height);
mCamera.setParameters(params);
mCamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
mBuffer.clear();
int width = camera.getParameters().getPreviewSize().width;
int height = camera.getParameters().getPreviewSize