赞
踩
最近研究在Android平台上使用Camera2API+OpenGLES进行预览并拍照的实现方案,遇到一个比较棘手的问题。对于Camera2使用OpenGLES进行预览显示没有问题,预览算法(如滤镜等)使用shader编写即可,但是当拍照的图片如何应用这个算法呢?
一般设置的预览尺寸是1080x1920,但是拍照尺寸是4000x3000,并且拍照的单帧数据也需要应用算法。我这里采用的方案是使用OES的纹理进行渲染预览。
1.创建YUV420_888格式的ImageReader,用来接收预览帧。
2.收到预览帧后,使用Image.getHardwareBuffer将该拍照帧转换成纹理glEGLImageTargetTexture2DOES
3.使用OpenGLES对该纹理进行算法处理
4.创建PixelForma.RGBA的ImageReader,并getSurface创建EGL,作为上述预览算法处理的surface.
5.算法完成后,调用swapbuffer可以在onFrameAvailable中收到RGBA格式的结果。
6.使用Image.getHardwareBuffer获取RGBA的数据,并在Native层生成bitmap对象,对于4000x3000的图片性能提升一倍。
JNIEXPORT jint JNICALL
Java_com_test_nativeTransformHardwareBuffer2Bitmap(JNIEnv *env, jclass clazz,
jobject hardwareBuffer,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。