Фотографии, снятые с камеры Android, полностью черные - PullRequest
4 голосов
/ 23 февраля 2012

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

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

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

Я также нашелследующим образом:

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

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

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

Ответы [ 3 ]

6 голосов
/ 11 марта 2013

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

Вы, вероятно, делаете это неправильно. Я предлагаю вам использовать обратный вызов 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 иногда работает, иногда не на моем телефоне.

2 голосов
/ 18 июля 2016

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

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

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

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

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

1 голос
/ 19 октября 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...