我制作相机并尝试拍摄照片。由于原始数据是YUV,我使用函数将其转换为RGB:
static public void decodeYUV420SP(byte[] rgbBuf, byte[] yuv420sp,int width, int height)
但是,保存的照片完全是黑色的,其中没有内容。
我还发现了以下方式:
mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
但项目已经关闭。
还有其他有效的方法来保存照片吗?谢谢!
答案 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时,它将我的图像捕获为全黑图像。这件事适用于我的情况。