这是我用来将图片保存到Bitmap
的代码。这段代码基于CyanogenMod相机应用程序的代码,因此我认为它应该能正常工作,但事实并非如此。这个问题最重要的是,在Nexus 4上测试时,Bitmap
在使用后置摄像头拍摄照片时被正确创建,但使用前置摄像头则会导致下面所示的结果。
我正在使用的创建Bitmap
的代码:
private class XyzPictureCallback implements Camera.PictureCallback {
@Override
public void onPictureTaken (byte [] data, Camera camera) {
Options options = new Options();
options.inDither = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap image = BitmapFactory.decodeByteArray(data, 0, data.length, options);
}
}
我尝试使用不同的选项
(甚至不使用选项),但没有效果。可能是由于两个不同相机返回的像素格式的问题,但当我运行getSupportedPictureFormats()
时,它们都会返回ImageFormat.JPEG
...
我已经没有任何想法了...
我应该还提到直接使用FileOutputStream
保存data
可以创建一个正确的JPEG图像。所以问题肯定在BitmapFactory
和我创建Bitmap
的方式上。
这是此代码生成的位图:
编辑 (24.03.2013):
花费多个小时尝试修复后,我仍然没有真正的解决方案。
我发现问题只在将图片大小(使用Camera.Parameters.setPictureSize(int width, int height)
)设置为前置摄像头可用的最高分辨率1280x960时才会发生问题,这个分辨率是通过调用Camera.Parameters.getSupportedPictureSizes()
获得的。
导致问题的分辨率为1280x960。就如我之前提到的,这是最高分辨率。第二高的是1280x720,当我使用这个分辨率时,输出图片很好。我确实检查了相机输出的格式,它一直是ImageFormat.JPEG,所以我不认为像素格式是问题所在...
编辑 (08.03.2013): 调用takePicture:
private class XyzAutoFocusCallback implements Camera.AutoFocusCallback {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (takingPicture) {
camera.takePicture(null, null, myPictureCallback);
} else {
...
}
}
options.inDither = false;
这不是必要的 -> options.inPreferredConfig = Bitmap.Config.ARGB_8888; 这是默认值:图像默认使用 ARGB_8888 配置加载。
- g00dy