从Android相机拍摄的照片完全是黑色的

时间:2012-02-23 17:03:16

标签: android camera image

我制作相机并尝试拍摄照片。由于原始数据是YUV,我使用函数将其转换为RGB:

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

但是,保存的照片完全是黑色的,其中没有内容。

我还发现了以下方式:

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

但项目已经关闭。

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

3 个答案:

答案 0 :(得分:6)

一个旧帖子,但它说的是我遇到的类似问题,所以我可能会回答我所知道的部分:)

你可能做错了。我建议你使用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();          
  }
}

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

答案 1 :(得分:2)

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

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

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

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

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

答案 2 :(得分:1)

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

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

当我使用TEMPLATE_STILL_CAPTURE而不是TEMPLATE_PREVIEW时,它将我的图像捕获为全黑图像。这件事适用于我的情况。