Android字节在Camera.onPreviewFrame中的图像

当试图转换Camera.onPreviewFramebyte[] Bitamp使用BitmapFactory.decodeByteArray给我一个错误SkImageDecoder::Factory returned null

以下是我的代码:

 public void onPreviewFrame(byte[] data, Camera camera) { Bitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length); } 

Solutions Collecting From Web of "Android字节在Camera.onPreviewFrame中的图像"

这已经很难find! 但是从API 8开始,android.graphics中有一个YuvImage类。 这不是一个图像的后代,所以你所能做的就是将它保存到Jpeg中,但是你可以将它保存到内存stream中,然后加载到位图图像中,如果这是你需要的。

 import android.graphics.YuvImage; @Override public void onPreviewFrame(byte[] data, Camera camera) { try { Camera.Parameters parameters = camera.getParameters(); Size size = parameters.getPreviewSize(); YuvImage image = new YuvImage(data, parameters.getPreviewFormat(), size.width, size.height, null); File file = new File(Environment.getExternalStorageDirectory() .getPath() + "/out.jpg"); FileOutputStream filecon = new FileOutputStream(file); image.compressToJpeg( new Rect(0, 0, image.getWidth(), image.getHeight()), 90, filecon); } catch (FileNotFoundException e) { Toast toast = Toast .makeText(getBaseContext(), e.getMessage(), 1000); toast.show(); } } 

从Android 3.0开始,您可以使用TextureViewTextureSurface来显示相机,然后使用mTextureView.getBitmap()来检索友好的RGB预览帧。

在TextureView文档中给出了一个非常骨架的例子。 请注意,您必须将清单中的android:hardwareAccelerated="true"设置为硬件加速的应用程序或活动。

经过很长一段时间,我find了答案。 这里是…

我没有使用BitmapFactory ,而是使用自定义方法将此byte[] data解码为有效的图像格式。 要将图像解码为有效的图像格式,需要通过调用camera.getParameters().getPictureFormat()来知道摄像机正在使用的图像格式。 这将返回由ImageFormat定义的常量。 知道格式后,使用适当的编码器对图像进行编码。

在我的情况下, byte[] dataYUV格式,所以我寻找YUVBMP转换,这解决了我的问题。

你可以尝试这个:这个例子发送相机帧到服务器

  @Override public void onPreviewFrame(byte[] data, Camera camera) { try { byte[] baos = convertYuvToJpeg(data, camera); StringBuilder dataBuilder = new StringBuilder(); dataBuilder.append("data:image/jpeg;base64,").append(Base64.encodeToString(baos, Base64.DEFAULT)); mSocket.emit("newFrame", dataBuilder.toString()); } catch (Exception e) { Log.d("########", "ERROR"); } } }; public byte[] convertYuvToJpeg(byte[] data, Camera camera) { YuvImage image = new YuvImage(data, ImageFormat.NV21, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int quality = 20; //set quality image.compressToJpeg(new Rect(0, 0, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height), quality, baos);//this line decreases the image quality return baos.toByteArray(); }