Android byte []在Camera.onPreviewFrame中成像

Vin*_*rya 16 android byte image decoding

当试图转换byte[]Camera.onPreviewFrameBitampBitmapFactory.decodeByteArray给我一个错误SkImageDecoder::Factory returned null

以下是我的代码:

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

wes*_*ton 32

这很难找到!但是从API 8开始,android.graphics中有一个YuvImage类.它不是一个Image后代,所以你能用它做的就是将它保存到Jpeg,但你可以将它保存到内存流中然后加载到Bitmap Image中,如果这就是你需要的.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常棘手的解决方案。保存为jpeg,然后立即对其进行解码?我想我宁愿使用自定义的YUV函数。 (2认同)

Tim*_*mmm 7

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

TextureView文档中给出了如何执行此操作的非常骨架的示例.请注意,您必须通过放入android:hardwareAccelerated="true"清单来将应用程序或活动设置为硬件加速.


Vin*_*rya 4

很久之后我找到了答案。这里是...

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

就我而言,它byte[] data是格式的YUV,所以我寻找YUV转换BMP,这解决了我的问题。