Это мой код, который я использую для сохранения изображения в 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);
}
}
Я попытался использовать разные Options
(и вообще ничего), но это не помогло. Это может быть что-то с пиксельным форматом, возвращаемым двумя разными камерами, но когда я побежал getSupportedPictureFormats()
, они оба вернули ImageFormat.JPEG
...
У меня заканчиваются идеи...
Я должен, вероятно, также упомянуть, что сохранение data
напрямую с помощью FileOutputStream
создавало правильный образ JPEG. Поэтому проблема должна быть с BitmapFactory
и тем, как я создаю Bitmap
.
Это растровое изображение, которое производит этот код:
EDIT (24.03.2013):
Проведя несколько часов, пытаясь исправить это, у меня до сих пор нет реального решения.
Все, что я узнал, заключается в том, что проблема возникает, когда я устанавливаю размер изображения (используя Camera.Parameters.setPictureSize(int width, int height)
) с максимально возможным разрешением, которое доступно для фронтальной камеры, которое я получил, вызывая Camera.Parameters.getSupportedPictureSizes()
.
Разрешение, вызывающее проблему, составляет 1280x960. Как я уже говорил ранее, это самое высокое разрешение. Второй самый высокий - 1280x720, и когда я использую это, выходное изображение прекрасное. Я проверил формат, который выкачивает камера, и он ImageFormat.JPEG все время, поэтому я не думаю, что формат пикселей здесь является проблемой...
EDIT (08.03.2013): Вызов toPicture:
private class XyzAutoFocusCallback implements Camera.AutoFocusCallback {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (takingPicture) {
camera.takePicture(null, null, myPictureCallback);
} else {
...
}
}