需求:有时候我们预览camera并不想直接输出camera捕获的图像而是想二次加工图像后再预览比如美颜、滤镜等等。这是我们可以用surfacetexture方案解决。
部分代码:
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open(1);
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
//这里你可以做美颜或滤镜然后渲染到surfaceview或glsurfaceview等等
Log.e("onPreviewFrame",
"onPreviewFrame() called with: data = [" + data + "], camera = [" + camera + "]");
}
});
try {
//这里有坑,不能用匿名对象必须传入有名字的对象,不然onPreviewFrame里只能得到有限几帧数据。
mCamera.setPreviewTexture(surfaceTexture);
//mCamera.setPreviewTexture(new SurfaceTexture(0))千万别这样写,定位此bug花费了不少力气;
} catch (IOException t) {
}
mCamera.startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2020/05/13 08:54