【问题标题】:Photos captured from Android camera are completely black从 Android 相机拍摄的照片完全是黑色的
【发布时间】:2012-02-23 17:03:15
【问题描述】:

我制作了一个相机并尝试拍摄一张照片。由于原始数据是YUV,所以我用函数把它变成了RGB:

static public void decodeYUV420SP(byte[] rgbBuf, byte[] yuv420sp,int width, int height)

但是,保存的照片是全黑的,里面没有任何内容。

我也找到了以下方法:

mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

但是项目被关闭了。

还有其他有效的保存照片的方法吗?谢谢!

【问题讨论】:

    标签: android camera image


    【解决方案1】:

    一个旧帖子,但它谈到了我遇到的类似问题,所以我不妨回答我知道的部分:)

    你可能做错了。我建议你使用 JPEG 回调来存储图像:

    mCamera.takePicture(null, null, callbackJPEG);
    

    通过这种方式,您可以将 JPEG 数据放入例程中,您可以将其存储到未修改的文件中:

    final Camera.PictureCallback mCall = new Camera.PictureCallback()
    {
      @Override
      public void onPictureTaken(byte[] data, Camera camera)
      {
        //Needs <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        File sdCard = Environment.getExternalStorageDirectory();
        File file = new File(sdCard, "pic.jpg");
        fil = new FileOutputStream(file);
        fil.write(data);
        fil.close();          
      }
    }
    

    就黑色图片而言,我发现在camera.startPreview()camera.takePicture() 之间放置一个简单的Thread.sleep(250) 可以解决我的Galaxy Nexus 上的特定问题。 我不知道为什么这个延迟是必要的。即使我添加camera.setOneShotPreviewCallback() 并从回调中调用camera.takePicture(),如果我不先延迟,图像也会变黑...... 哦,延迟不仅仅是“一些”延迟。它必须是一些相当长的价值。例如,250ms 有时可以在我的手机上使用,有时却不行。

    【讨论】:

    • 现在我正在努力解决同样的问题。我的设备也是 Galaxy Nexus。您是否找到了可行的解决方案?
    • 你在其他设备上拍过全黑的照片吗?
    • 答案中描述的工作解决方案。是的,其他设备的用户已确认该问题。
    • 我没有这些信息。一些。然后我增加了延迟,报告不再收到。请注意,延迟从一开始就存在,因为我自己的设备在没有它的情况下拒绝工作。
    【解决方案2】:

    完整的黑色照片是在调用mCamera.startPreview() 后立即调用mCamera.takePicture() 的结果。在拍摄实际照片之前,应该给 Android 适当的时间来处理其自动对焦活动。黑度是自动对焦发生时由于中断而导致曝光不稳定的结果。

    我建议在mCamera.startPreview() 之后立即致电mCamera.autoFocus()

    mCamera.takePicture()应该在自动对焦函数调用的回调函数中调用。

    此流程可确保在完成自动对焦后拍摄照片,并消除所拍摄图像的黑度或曝光问题。

    Velis 的回答中提到的延迟适用于某些设备,因为这些设备会完成自动对焦活动。确保正确的回调流程可以消除这种任意延迟,并且适用于每台设备。

    【讨论】:

    • 谢谢!我正在构建一个庞大的图像数据库,其中百分之几只是黑色的。
    【解决方案3】:

    我使用以下参数解决了这个问题:

    final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
    

    当我使用 TEMPLATE_STILL_CAPTURE 而不是 TEMPLATE_PREVIEW 时,它会将我的图像捕获为全黑图像。这件事在我的情况下有效。

    【讨论】:

    • 我这样做了,还使用了 CONTINUOUS_PICTURE 和 setRepeating (...)
    猜你喜欢
    • 2012-08-15
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多