2012-02-23 2 views
4

Я делаю камеру и пытаюсь захватить снимок. Поскольку исходные данные YUV, я включаю его в с помощью функции RGB:Фотографии, снятые с камеры Android, полностью черные

static public void decodeYUV420SP(byte[] rgbBuf, byte[] yuv420sp,int width, int height) 

Тем не менее, фото сохранено полностью черные, нет никакого содержания в нем.

Я также нашел следующий способ:

mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 

но проект был закрыт.

Есть ли другие эффективные способы сохранения фотографии? Спасибо!

ответ

6

старый пост, но это говорит о подобной проблеме, которая у меня есть, так что я мог бы также ответить на часть я знаю :)

Вы, вероятно, делают это неправильно. Я предлагаю вам использовать обратный вызов JPEG для хранения изображений:

mCamera.takePicture(null, null, callbackJPEG); 

Таким образом, вы получите данные JPEG в рутину, которые можно хранить в файле неизмененном:

final Camera.PictureCallback mCall = new Camera.PictureCallback() 
{ 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) 
    { 
    //Needs <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    File sdCard = Environment.getExternalStorageDirectory(); 
    File file = new File(sdCard, "pic.jpg"); 
    fil = new FileOutputStream(file); 
    fil.write(data); 
    fil.close();   
    } 
} 

Насколько черный картинка идет, я обнаружил, что размещение простого Thread.sleep(250) между camera.startPreview() и camera.takePicture() позаботится об этой конкретной проблеме на моем Galaxy Nexus. Я понятия не имею, зачем нужна эта задержка. Даже если я добавлю camera.setOneShotPreviewCallback() и позвоню camera.takePicture() из обратного вызова, изображение выходит черным, если я не задерживаю ... О, и задержка - это не просто «некоторая» задержка. Это должно быть довольно долгое значение. Например, 250ms иногда работает, иногда не на моем телефоне.

+0

Теперь я борюсь с той же проблемой. И мое устройство - Galaxy Nexus.Удалось ли вам найти рабочее решение? –

+0

Получали ли вы абсолютно черные фотографии на других устройствах? –

+0

Рабочее решение описано в ответе. Да, проблема была подтверждена пользователями других устройств. – velis

2

Полная черная фотография является результатом немедленного звонка в mCamera.takePicture() после звонка mCamera.startPreview(). Android должен получить соответствующее время для обработки своей активности автофокуса, прежде чем принимать фактическое изображение. Черность является результатом неустойчивой экспозиции, вызванной прерыванием, когда происходит автофокусировка.

Я рекомендую позвонить mCamera.autoFocus() сразу после mCamera.startPreview().

mCamera.takePicture() следует вызывать в функции обратного вызова функции функции автофокусировки.

Этот поток гарантирует, что изображение будет сделано после завершения автофокуса и удалит черноты или проблемы с экспозицией из сделанного изображения.

Задержка, упомянутая в Ответы Velis ' Ответы на некоторые устройства, потому что эти устройства выполняют функцию автофокуса. Обеспечение надлежащего потока обратного вызова устраняет эту произвольную задержку и будет работать на каждом устройстве.

+0

Спасибо! Я создаю массивную базу данных изображений, и несколько процентов из них просто черные. – domenukk

1

Я решил эту проблему, используя следующий аргумент:

final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 

Когда я использовал TEMPLATE_STILL_CAPTURE вместо TEMPLATE_PREVIEW, который, захватив мое изображение как полный черный образ. Эта вещь работает в моем случае.

+0

Я сделал это плюс использовать CONTINUOUS_PICTURE и setRepeating (...) – Clocker

Смежные вопросы