До сих пор у меня была та же проблема, и теперь мне удается исправить мою, используя
setPictureFormat(ImageFormat.JPEG);
Настройки параметров камеры.
Совсем недавно обнаружил, что по умолчанию для камеры выводится изображение YUV. Вот почему он отлично отображается при предварительном просмотре, но после того, как снимок сделан, вы получите зеленый, розовый или поврежденный вывод изображения.
Это значения ImageFormat, которые могут поддерживаться камерой.
JPEG = 256;
NV16 = 16;
NV21 = 17;
RAW10 = 37;
RAW_SENSOR = 32;
RGB_565 = 4;
UNKNOWN = 0;
YUV_420_888 = 35;
YUY2 = 20;
YV12 = 842094169;
Таким образом, кроме поддерживаемого размера, в некоторых случаях нам может потребоваться также проверить PictureFormat.
http://i.stack.imgur.com/PlHFH.png
Это просто примеры изображений, снятых с использованием ImageFormat YUV и сохраняющих его как сжатие JPEG.
Но в любом случае, если вы не хотите изменять ImageFormat и, следовательно, сохранять настройки в формате YUV, вам может понадобиться сохранить изображение в этом временном решении:
Camera.Parameters parameters = camera.getParameters();
Camera.Size size = parameters.getPreviewSize();
YuvImage image = new YuvImage(data, parameters.getPreviewFormat(),
size.width, size.height, null);
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "YuvImage.jpg");
FileOutptStream filecon = new FileOutputStream(file);
image.compressToJpeg(new Rect(0, 0, image.getWidth(), image.getHeight()), 90,
filecon);