CWAC-Camera, предварительный просмотр камеры слишком мал

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

Я работаю над CWAC-камерой, и есть проблема, которую я не понимаю.

Я пытаюсь сделать снимок с помощью CWAC-камеры, а затем отображаю его в «галерейном» действии. Дело в том, что «диапазон» (?) моего предварительного просмотра камеры намного меньше, чем в моем предварительном просмотре галереи.

Я думаю, будет понятнее, если я покажу вам фотографии:

Предварительный просмотр камеры: http://i.imgur.com/U7RAMo6.jpg (это снимок экрана )

Предварительный просмотр галереи: http://i.imgur.com/jU5CAmG.jpg

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

Мое программное обеспечение использует getPreferredPreviewSize(). Я пытался переопределить getPreviewSize() или getPreferredPreviewSizeForVideo(), но это ничего не меняет. Я думаю, что не понимаю, как использовать эти переопределения, даже с документацией и вопросами о stackoverflow.

Вот обрезанная версия моей MainActivity:

private CameraView mCameraView;

@Override
 public void onAttach(Activity activity) {
    super.onAttach(activity);
    MySingletonClass singleton = new MySingletonClass();

    Singleton.getInstance().setMySingletonClass(singleton);
    // We overrided the Camera Host so we can start the email activity in the saveImage() method
    MyCustomCameraHost myCustomCameraHost = new MyCustomCameraHost(activity, this, mIsSaving, mCameraView);
    this.setHost(myCustomCameraHost);
}
[...]
@Override
public void onDetach() {
    super.onDetach();
    mSensorManager.unregisterListener(this);
}
[...]
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_preview, container, false);
    view.setOnClickListener(this);

    mCameraView = (CameraView) view.findViewById(R.id.cameraSurfaceView);
    mCameraView.setHost(getHost());

    //Camera.open(getHost().getCameraId()).setOneShotPreviewCallback(this);
    mCameraView.setPreviewCallback(this);
    setCameraView(mCameraView);

    return view;
}

Вот мой макет CameraView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="@drawable/border"
android:layout_height="match_parent" >
[...]
<com.commonsware.cwac.camera.CameraView
    android:id="@+id/cameraSurfaceView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true" />
[...]
</RelativeLayout>

Моя активность отображения проста:

mImageView.setImageBitmap(myBitmap);

У моего телефона родное разрешение 1280*720, поэтому я подумал, что это соотношение было взято для предварительного просмотра камеры. Сделанная фотография имеет разрешение 3264 * 2448, поэтому, когда я показываю ее в своей галерее, она имеет черные рамки (мне все равно).

Не могли бы вы помочь мне исправить «диапазон» моего предварительного просмотра камеры?

Спасибо за ваше время.


person Axel Syntes    schedule 03.07.2015    source источник
comment
Я хотел бы, чтобы предварительный просмотр моей камеры отображал то же самое изображение, что и предварительный просмотр моей галереи — если предположить, что предварительный просмотр галереи представляет собой какое-то предустановленное приложение, это может быть невозможно, поскольку производители устройств обманывают. Кроме того, вам нужно будет определить, какой размер предварительного просмотра вы используете и какое соотношение сторон отображается в предварительном просмотре галереи. Вам также может понадобиться отключить предварительный просмотр без полей, так как он обрезает то, что показано в файле CameraView. Я думаю, что не понимаю, как использовать эти переопределения - никто не может вам помочь с ними, так как они не в вашем вопросе.   -  person CommonsWare    schedule 03.07.2015
comment
Предварительный просмотр галереи — это какое-то предустановленное приложение. Это просто действие с mImageView.setImageBitmap(myBitmap); для понимания. Вам также может понадобиться отключить предварительный просмотр без полей. Для этого getPreviewSize() должен возвращать размер с тем же соотношением, что и в галерее? И я думаю, что соотношение сторон 4:3 (1,33 - нормальное) с учетом разрешения изображения. Как вы думаете, я должен переопределить getPreviewSize(), чтобы получить соотношение сторон 4:3 для предварительного просмотра камеры?   -  person Axel Syntes    schedule 03.07.2015
comment
Для этого getPreviewSize()... -- нет. См. документацию для предварительного просмотра без полей. Как вы думаете, я должен переопределить getPreviewSize(), чтобы получить соотношение сторон 4:3 для предварительного просмотра камеры? -- если я понимаю, что вы хотите (предварительный просмотр и изображение должны соответствовать), вы должны выбрать одинаковое соотношение сторон как для размера предварительного просмотра, так и для размера изображения из подходящих размеров для каждого из них. Однако имейте в виду, что камера не обязана возвращать один и тот же контент для предварительного просмотра и изображений.   -  person CommonsWare    schedule 03.07.2015
comment
Спасибо, Марк. Я применю предварительный просмотр без полей, надеюсь, это то, что я хотел. Я буду держать вас на связи. вы должны выбрать одно и то же соотношение сторон как для размера предварительного просмотра, так и для размера изображения. Для этого я должен переопределить getPreviewSize() и вернуть размер с соотношением сторон 4:3? (Мой предварительный просмотр изображения 4: 3), верно? См. ссылка[ссылка]   -  person Axel Syntes    schedule 03.07.2015
comment
Это действительно странно. Это работает на Samsung Galaxy S2 (предварительный просмотр камеры намного шире), но не на Samsung Galaxy S3. Ты знаешь почему? Мой CameraHost настроен на false с useFullBleedPreview(). В моем логарифме он проходит через useFullBleedPreview(), поэтому я думаю, что там все в порядке.   -  person Axel Syntes    schedule 03.07.2015
comment
Ты знаешь почему? -- нет, за исключением моего предыдущего примечания о том, что нет требования, чтобы камера устройства предоставляла один и тот же контент для предварительного просмотра и изображений. Поэтому я никогда лично не беспокоился об этой проблеме.   -  person CommonsWare    schedule 03.07.2015


Ответы (1)


Мой ответ:

Я переопределил это: (SimpleCameraHost.java)

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public Camera.Size getPreferredPreviewSizeForVideo(int displayOrientation,
                                                 int width,
                                                 int height,
                                                 Camera.Parameters parameters,
                                                 Camera.Size deviceHint) {
List<Camera.Size> previewSizesList = parameters.getSupportedPreviewSizes();

for(int idx = 0; idx < previewSizesList.size(); idx++)
{
  Log.e("myDebug", "Height----------------- " + previewSizesList.get(idx).height);
  Log.e("myDebug", "Width----------------- " + previewSizesList.get(idx).width);
}

if (deviceHint != null) {
  return(previewSizesList.get(0));
  // return(deviceHint);
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
  //it goes through here
  return(previewSizesList.get(0));
  //return(parameters.getPreferredPreviewSizeForVideo());
}

return(null);
}

Я выбрал previewSizesList.get(0) (индекс 0), потому что соотношение этого размера (960w, 720h), предоставленное getSupportedPreviewSizes(), равно 1,33333, что соответствует соотношению фотографий, которые я могу сделать (3264/2448 = 1 ,3333).

Вы также можете проверить документацию здесь: https://github.com/commonsguy/cwac-camera#supporting-full-bleed-preview дает тот же результат (на некоторых устройствах), но сделать его проще.

person Axel Syntes    schedule 03.07.2015