Android Camera Preview портит вывод изображения на G2?

Я использую Android Camera и SurfaceView, чтобы показать пользователю предварительное изображение перед тем, как сделать снимок. Это выглядит хорошо на экране, но когда я делаю снимок, полученный jpg поврежден (горизонтальные линии).

В качестве отправной точки я использовал пример Camera/Picture Марка Мерфи, который та же проблема на G2.

Параметры камеры:

размер превью: 800x480

формат изображения: JPEG

Оба параметра поддерживаются в соответствии с getSupportedPreviewSizes() и getSupportedPictureFormats()

Nexus One с таким же размером экрана корректно работает с теми же параметрами.

G2 работает правильно при установке размера предварительного просмотра на 640x480.

Мой вопрос: Кто-нибудь еще сталкивался с этой проблемой раньше (изображение повреждено, несмотря на использование поддерживаемых настроек)? Как часто это происходит? Как вы обошли это?


person smith324    schedule 06.08.2011    source источник
comment
В настоящее время у меня нет G2, и поэтому я не могу ответить на этот вопрос — извините!   -  person CommonsWare    schedule 06.08.2011
comment
@CommonsWare Но вы не видели эту проблему на других устройствах? Я надеюсь, что это не распространено, и предстоящее обновление Android 2.3 это исправит.   -  person smith324    schedule 07.08.2011
comment
Но вы не видели эту проблему на других устройствах? -- Нет.   -  person CommonsWare    schedule 07.08.2011


Ответы (1)


До сих пор у меня была такая же проблема, и теперь мне удается исправить мою, используя

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);
person zaqxen    schedule 17.03.2015