2017-02-01 5 views
2

Я использую sample code для Camera2, и мне было интересно, как я могу сделать предварительный просмотр и захваченное изображение в полноэкранном режиме? This Вопрос SO, похоже, решает его в видеорежиме, но я не могу найти решение для захвата изображений. Фрагмент фрагмента имеет голубую область внизу, а также имеет статус bas. Я хочу скрыть оба из них и использовать весь экран, чтобы показать предварительный просмотр, а также захватить изображение в полноэкранном режиме.Camera2 полноэкранный просмотр и захват изображения

ответ

2

Обратите внимание, что соотношение сторон датчика камеры и соотношение сторон экрана устройства чаще всего не совпадают - датчики обычно имеют соотношение 4: 3 и экраны, как правило, около 16: 9. Хотя в обоих есть широкая вариация.

Поскольку пропорции не совпадают, вам нужно решить, будете ли вы иметь черные полосы или масштабировать предварительный просмотр камеры так, чтобы он заполнял экран (но некоторая часть изображения не видна).

В любом случае, чтобы предварительный просмотр был полноэкранным, вам просто нужно, чтобы TextureView (или SurfaceView) был всего макета. Поэтому в основном отредактируйте этот файл макета: fragment_camera2_basic.xml, удалите все другие виды и удалите ссылки на них в исходном коде. Или измените их, чтобы они были поверх TextureView, а не рядом - это все стандартные элементы интерфейса Android UI. И вам нужно сделать свою активность full-screen.

По умолчанию AutoFillTextureView будет пытаться поддерживать соотношение сторон, поэтому он будет создавать черные полосы. Если вам не нужны черные полосы, вам придется изменить AutoFillTextureView, что не является простым, и я не буду вдаваться в него здесь.

+0

Эдди, если вы знаете, как решить «захватить изображение с соотношением сторон 16: 9», можете ли вы добавить это к своему ответу или поместить ссылку на ответ? Я был Googling, но пока не повезло ... –

+0

Я не уверен, что вы спрашиваете - вы имели в виду ссылку на какой-то другой вопрос StackOverflow? Если вы хотите записать 16: 9 JPEG, вам нужно выбрать разрешение 16: 9 для ImageReader, который вы используете для их захвата. –

+0

Вот что я собирался попробовать дальше: http://stackoverflow.com/questions/26583489/android-5-0-wrong-crop-regions-on-preview-surface-and-captured-still-image Хорошо, Спасибо за ваш ответ. Я тоже попробую! –

0

Eddy правильно относится к соотношению сторон. Датчик камеры составляет 4: 3. Экран обычно 16: 9. Код образца позволяет показывать весь просмотр камеры, поэтому часть экрана не заполняется. Вам нужно растянуть, чтобы заполнить весь экран, однако в этом случае захваченные изображения включают области, не показанные в предварительном просмотре.

Для его просмотра в полноэкранном режиме, в AutoFitTextureView, изменить метод onMeasure к этому:

@Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     int width = MeasureSpec.getSize(widthMeasureSpec); 
     int height = MeasureSpec.getSize(heightMeasureSpec); 
     if (0 == mRatioWidth || 0 == mRatioHeight) { 
      setMeasuredDimension(width, height); 
     } else { 
      if (width < height * mRatioWidth/mRatioHeight) { 
       // setMeasuredDimension(width, width * mRatioHeight/mRatioWidth); 
       setMeasuredDimension(height * mRatioWidth/mRatioHeight, height); 
      } else { 
       //setMeasuredDimension(height * mRatioWidth/mRatioHeight, height); 
       setMeasuredDimension(width, width * mRatioHeight/mRatioWidth); 
      } 
     } 
    } 

Update: Как отметил Эдди, это покажет верхнюю левую часть камеры предварительного просмотра на в полноэкранном режиме, оставляя нижнюю и правую сторону вне поля зрения, результат заключается в том, что изображение находится вне центра. В моем конкретном случае объект должен быть центрирован по горизонтали, поэтому я модифицировал матрицу преобразования, чтобы центрировать объект горизонтально. Вот код:

// adjust the x shift because we are not showing the whole camera sensor on the screen, need to center the capture area 
    int screenWidth = Resources.getSystem().getDisplayMetrics().widthPixels; 
    Log.d(TAG, "screen width " + screenWidth); 
    int xShift = (viewWidth - screenWidth)/2; 
    matrix.setTranslate(-xShift, 0); 

     mTextureView.setTransform(matrix); 
+0

В качестве примечания это скорее всего не будет центрировать предварительный просмотр на экране - он будет отрезаться справа и внизу (хотя мне нужно будет точно проверить, как в этом случае расширяется содержащийся родительский родитель). Это может или не важно для вас. –

+0

@EddyTalvala Вы правы в этом. Я модифицировал матрицу преобразования, чтобы центрировать предварительный просмотр. Обновлен образец кода в сообщении. – Ray