【问题标题】:Android decode Bitmap from Camera PreviewAndroid 从相机预览中解码位图
【发布时间】:2012-10-08 18:17:29
【问题描述】:

我正在尝试从相机预览中获取位图图像,我将在执行人脸检测后对其进行一些处理并绘制一些叠加层。

看了一圈,发现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 */

}

问题是,“预览”对象不为空,但它显然不是有效的位图。在调试器上,我可以看到 mWidth 和 mHeight 都设置为 -1,这对我来说似乎是错误的。我做错了什么?

【问题讨论】:

  • 如果您正在绘制叠加层并执行面部检测等繁重的工作,您将需要加快 NDK 的速度。看看 GLSurfaceView 以及它如何与回调一起使用。您不需要 jpeg - 对本机字节数组进行操作
  • @AndrewG,当使用GLSurfaceView 时,如何将图像帧作为Bitmap

标签: android android-camera bitmapfactory


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您使用的是getPictureSize 而不是getPreviewSize :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多