android5.0使用camera2 api实现实时渲染,在显示预览部分出现的问题
因为要做实时渲染功能的相机,因此第一步自然是获取预览图然后保证能实时处理
试过opencv的相机处理方式,通过给相机设置一个不显示的surface,然后将获取的yuv图像数据刷到自己的surfaceview上
这个例子在5.0下可以正常运行,然而在5.0上没有办法给相机设置一个空的surface,程序抛异常
所以转而改用camera2来解决问题
现在的方案是通过修改ImageReader的接受图像类型,在回调中处理图片数据,然后将图像刷到自己的surfaceview上
所有代码写完后,获取到得图像是绿色的一层,不知道为什么,相关代码如下,希望高手指教
或者有什么好的做实时渲染功能的方案也可以请教一下
//设置ImageReader监听接收的图像类型
分别获取yuv图像的三个通道函数,将yuv420格式转换为argb8888格式颜色数据
我通过将yuv获取到的三通道字节数据直接写入文件,用yuv查看文件查看后也是带有一层绿色的预览图像,基本可以判断转换函数没有问题
试过opencv的相机处理方式,通过给相机设置一个不显示的surface,然后将获取的yuv图像数据刷到自己的surfaceview上
这个例子在5.0下可以正常运行,然而在5.0上没有办法给相机设置一个空的surface,程序抛异常
所以转而改用camera2来解决问题
现在的方案是通过修改ImageReader的接受图像类型,在回调中处理图片数据,然后将图像刷到自己的surfaceview上
所有代码写完后,获取到得图像是绿色的一层,不知道为什么,相关代码如下,希望高手指教
或者有什么好的做实时渲染功能的方案也可以请教一下
//设置ImageReader监听接收的图像类型
largest = Collections.max(Arrays.asList(map
.getOutputSizes(ImageFormat.YUV_420_888)),
new CompareSizesByArea());
bitmap = Bitmap.createBitmap(largest.getWidth(),
largest.getHeight(), Config.ARGB_8888);
mImageReader = ImageReader.newInstance(largest.getWidth(),
largest.getHeight(), ImageFormat.YUV_420_888, /* maxImages */
2);
mImageReader.setOnImageAvailableListener(
mOnImageAvailableListener, mBackgroundHandler);分别获取yuv图像的三个通道函数,将yuv420格式转换为argb8888格式颜色数据
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
synchronized (mThread) {
Log.d(tag, "previewing");
Image img = reader.acquireLatestImage();
if (img == null)
return;
ByteBuffer[] buffer = new ByteBuffer[3];
for (int i = 0; i < 3; i++) {
buffer[i] = img.getPlanes()[i].getBuffer();
}
rgb = new int[img.getWidth() * img.getHeight()];
byte[] y_bytes = new byte[buffer[0].remaining()];
byte[] cb_bytes = new byte[buffer[1].remaining()];
byte[] cr_bytes = new byte[buffer[2].remaining()];
buffer[0].get(y_bytes, 0, buffer[0].remaining());
buffer[1].get(cb_bytes, 0, buffer[1].remaining());
buffer[2].get(cr_bytes, 0, buffer[2].remaining());
decodeYUV420SPargb8888(rgb, y_bytes, cb_bytes, cr_bytes,
largest.getWidth(), largest.getHeight());
img.close();
// 保存文件
try {
FileOutputStream fos = new FileOutputStream(
Environment.getExternalStorageDirectory()
+ "/test/yuv");
fos.write(y_bytes);
fos.write(cb_bytes);
fos.write(cr_bytes);
fos.close();
Log.d(tag, "save");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mThread.notify();
}
}
};我通过将yuv获取到的三通道字节数据直接写入文件,用yuv查看文件查看后也是带有一层绿色的预览图像,基本可以判断转换函数没有问题
...全文
相关推荐
PlayCamera_V1.0.0(SurfaceView预览Camera,拍照demo)
开发者需要考虑到这些差异,可能需要使用Camera2 API(自Android 5.0开始引入)以获得更好的兼容性和控制性。10.
PlayCamera_V3.0.0[使用GLsurfaceView预览Camera 拍照demo]
《使用GLSurfaceView预览Camera拍照的Demo详解》在Android开发中,处理摄像头功能是一项常见的任务,而GLSurfaceView是实现高性能图形渲染的一种方式。
Android原生Camera2完成预览和拍照
本文将深入探讨如何使用Camera2 API来实现预览和拍照功能。
Android camera2预览和取数据
在Android平台上,Camera2 API是自Android 5.0(API级别21)引入的全新相机接口,旨在提供更高级别的控制和性能。
android通过camera和surfaceview选择摄像头并即时预览
**Camera API**:Android提供了Camera类,用于与设备上的摄像头硬件进行交互。这个API允许开发者控制摄像头参数,如分辨率、焦距、曝光等,同时提供预览和拍照功能。2.


