2015-12-09 1 views
4

Я создаю приложение для Android, но устройство имеет квадратный экран. Экран 320x320 и приложение камеры использует SurfaceView для предварительного просмотра, как показано ниже:Android Camera Preview на квадратном экране растягивается

mCameraView = (SurfaceView) findViewById(R.id.surface); 
    LayoutParams params = mCameraView.getLayoutParams(); 
    int camera_dimension = getResources().getInteger(R.integer.camera_dimension); 
    params.height = camera_dimension; //320px 
    params.width = camera_dimension; 

    mCameraView.setLayoutParams(params); 
    mCameraViewHolder = mCameraView.getHolder(); 
    mCameraViewHolder.addCallback(this); 
    mCameraViewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

На поверхности изменился, я делаю это, и это работает, но сторонник предварительный просмотр W480 х H320

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

    int mWidth = w; 
    int mHeight = h; 
    int mFormat = format; 

    try { 
     mCameraAccess.mCamera.stopPreview(); 
    } catch (Exception e){ 
     // ignore: tried to stop a non-existent preview 
    } 
    Camera.Parameters param = mCameraAccess.mCamera.getParameters(); 

    List<Camera.Size> SupportedPreview = param.getSupportedPreviewSizes(); 
    int ScreenSize = getResources().getInteger(R.integer.camera_dimension); 

    for (int i = 0; i < SupportedPreview.size(); i++) { 
     if (SupportedPreview.get(i).height == ScreenSize) { 
      param.setPreviewSize(SupportedPreview.get(i).width, SupportedPreview.get(i).height); 
      break; 
     } 
    } 
    mCameraAccess.mCamera.setParameters(param); 
    mCameraAccess.mCamera.startPreview(); 
} 

Как можно убедиться, что мой предварительный просмотр внутри зрителя не сжимается, а является своего рода центральной фигурой. Поскольку предварительный просмотр представляет собой прямоугольник, мне просто нужен квадрат с центром на изображении. Обычно я использую scaleType, но не поддерживается в Surface view

Любая идея?

ответ

3

Решение, которое я понял, это:

1) -Храните вид поверхности полный экран, так что это не растягивается.

2) -Нажмите вид на поверхность с полной непрозрачностью. Так выглядит, что камера уже в квадрате.

3) После захвата изображения или видео вам придется обрезать их.

Для видео вы должны использовать некоторую библиотеку обработки видео, такую ​​как javacv.Используя эту библиотеку, вы можете извлекать видеокадры, конвертировать их в растровые изображения, обрезать растровое изображение в квадрате и затем перекодировать в видео.

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

Исходное изображение:

enter image description here

Squared Изображение:

enter image description here