从相机预览Android的位图解码(Android decode Bitmap from Camer

2019-09-23 17:06发布

我想,从相机的预览上我会做一些处理,并进行人脸检测后,得出了一些重叠位图图像。

环顾四周后,我发现了该字节数组onPreviewFrame需要不能被解码成直接的位图,它需要被转换为使用YuvImage正确的像素格式,而这正是我所做的:

@Override
public void onPreviewFrame(byte[] data, Camera camera)
{
    YuvImage temp = new YuvImage(data, camera.getParameters().getPreviewFormat(), camera.getParameters().getPictureSize().width, camera.getParameters().getPictureSize().height, null);

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    temp.compressToJpeg(new Rect(0, 0, temp.getWidth(), temp.getHeight()), 80, os);

    Bitmap preview = BitmapFactory.decodeByteArray(os.toByteArray(), 0, os.toByteArray().length);

    /* DO SOMETHING WITH THE preview */

}

问题是,“预览”对象不为空,但它aparently不是一个有效的位图。 在调试器,我可以看到mWidth和mHeight都被设置为-1,看来我错了。 我究竟做错了什么?

Answer 1:

在API级别8或更高版本,你可以用下面的代码非常迅速压缩图像为JPEG。

public void onPreviewFrame(byte[] data, Camera arg1) {
    FileOutputStream outStream = null;
    try {
        YuvImage yuvimage = new YuvImage(data,ImageFormat.NV21,arg1.getParameters().getPreviewSize().width,arg1.getParameters().getPreviewSize().height,null);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        yuvimage.compressToJpeg(new Rect(0,0,arg1.getParameters().getPreviewSize().width,arg1.getParameters().getPreviewSize().height), 80, baos);

        outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));  
        outStream.write(baos.toByteArray());
        outStream.close();

        Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }
    Preview.this.invalidate();
}

从https://code.google.com/p/android/issues/detail?id=823#c37



Answer 2:

这里有一个关于您的问题的详细信息: https://code.google.com/p/android/issues/detail?id=823



Answer 3:

您使用getPictureSize代替getPreviewSize :)



文章来源: Android decode Bitmap from Camera Preview