这是我用来将图像保存到 Bitmap
的代码。这段代码是基于 CyanogenMod 的相机应用程序的代码,所以我认为它可以正常工作但不行。关于这个问题最重要的事情是,当在 Nexus 4 上测试时,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);
}
}
我尝试使用不同的Options
(但根本没有),但没有帮助。这可能与两个不同相机返回的像素格式有关,但是当我运行 getSupportedPictureFormats()
时,它们都返回了 ImageFormat.JPEG
...
我的想法已经用完了......
我可能还应该提到,直接使用 FileOutputStream
保存 data
是创建正确的 JPEG 图像。所以问题一定出在 BitmapFactory
和我创建 Bitmap
的方式上。
这是这段代码生成的位图:
编辑(2013 年 3 月 24 日):
在花了多个小时试图解决这个问题后,我仍然没有真正的解决方案。
我所发现的只是当我将图片大小时(使用 Camera.Parameters.setPictureSize(int width, int height)
)设置为可用的最高分辨率时才会出现问题我通过调用 Camera.Parameters.getSupportedPictureSizes()
获得的前置摄像头。
导致问题的分辨率是 1280x960。正如我之前提到的,它是最高分辨率。第二高的是 1280x720,当我使用这个时,输出图片很好。我确实检查了相机吐出的格式,它一直都是 ImageFormat.JPEG,所以我认为像素格式不是这里的问题...
编辑(08.03.2013): 打电话拍照:
private class XyzAutoFocusCallback implements Camera.AutoFocusCallback {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (takingPicture) {
camera.takePicture(null, null, myPictureCallback);
} else {
...
}
}
最佳答案
该相机不支持高度和宽度。这就是它看起来像那样以及 1280x720 设置起作用的原因。这就像您将星际争霸设置为以您的显示器不支持的分辨率运行一样。
关于android - 相机图片到位图导致图像困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15404547/