Camera2 API预览图 YUV转RGB方法性能比较
Android5.0发布后,随着Camera2的兼容性不断提升,目前完全可以替代旧API的使用。而Camera2在调用方法、相机设置、图片获取等方面都变化很大。在实时预览图像获取时,通用的图片格式由 YUV_NV21 变为 YUV_420_888 ,因此在转换为Bitmap时出现了问题,由于Google并没有直接提供YUV2RGB的方法,因此网上代码鱼龙混杂,本文总结了几个高效的转换方法。 //Camera API public void onPreviewFrame(byte[] data, Camera camera){ YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); } //Camera2 API public void onImageAvailable(ImageReader reader){ Image image = reader.acquireLatestImage(); } 原理 可以看出NV21和YUV很相似,因此由NV21[/latex]gt;RGB的时间与YUV[/latex]gt;RGB的时间相似。 JAVA直接转码 该方法实现简单,处理640×480预览图平均时间为33ms public void onImageAvailable(ImageReader reader) { Image image = reader.acquireLatestImage(); if (image == null) return; ByteArrayOutputStream outputbytes = new ByteArrayOutputStream(); ByteBuffer bufferY = image.getPlanes()[0].getBuffer(); byte[] data0 = new byte[bufferY.remaining()]; bufferY.get(data0); ByteBuffer bufferU = image.getPlanes()[1].getBuffer(); byte[] data1 = new byte[bufferU.remaining()]; bufferU.get(data1); ByteBuffer bufferV = image.getPlanes()[2].getBuffer(); byte[] data2 = new byte[bufferV.remaining()]; bufferV.get(data2); try { outputbytes.write(data0); outputbytes.write(data2); outputbytes.write(data1); } catch (IOException e) { e.printStackTrace(); } final...