6

Я использую пример штрих-кода для Google Android API Vision. Размер предварительного просмотра, похоже, не заполняет все свободное пространство (я использую Nexus 4, а справа от предварительного просмотра - около 1/3 ширины).Размер предварительного просмотра для сканера штрих-кода от зрения api

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

Так что немного я играл с это:

CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(), barcodeDetector).setFacing(CameraSource.CAMERA_FACING_BACK).setRequestedPreviewSize(?, ?).setRequestedFps(15.0f); 

Любые идеи?

Спасибо!

+0

У меня такая же проблема. могли бы удовлетворить это решение. Я уже прошел через потоки github, но не мог понять, как ограничить область обнаружения. – Madhu

ответ

10

просто удалить или комментарий ниже код из класса CameraSourcePreview

if (childHeight > layoutHeight) { 
    childHeight = layoutHeight; 
    childWidth = (int)(((float) layoutHeight/(float) height) * width); 
} 

и использовать layoutHeight вместо childHeight класса «CameraSourcePreview» в этом цикле - для (INT I = 0; я < GetChildCount(); ++ я) {...}

if (mCameraSource != null) 
    { 
     Size size = mCameraSource.getPreviewSize(); 
     if (size != null) 
     { 
      width = size.getWidth(); 
      height = size.getHeight(); 
     } 
    } 

    // Swap width and height sizes when in portrait, since it will be rotated 90 degrees 
    if (isPortraitMode()) 
    { 
     int tmp = width; 

     //noinspection SuspiciousNameCombination 
     width = height; 
     height = tmp; 
    } 

    final int layoutWidth = right - left; 
    final int layoutHeight = bottom - top; 

    // Computes height and width for potentially doing fit width. 
    int childWidth = layoutWidth; 
    int childHeight = (int) (((float) layoutWidth/(float) width) * height); 

    for (int i = 0; i < getChildCount(); ++i) 
    { 
     getChildAt(i).layout(0, 0, childWidth, layoutHeight); 
    } 

    try 
    { 
     startIfReady(); 
    } 
    catch (SecurityException se) 
    { 
     Log.e(TAG, "Do not have permission to start the camera", se); 
    } 
    catch (IOException e) 
    { 
     Log.e(TAG, "Could not start camera source.", e); 
    } 
} 
+1

Хотя это технически работает, у меня есть два замечания. 1: прямо сейчас вы используете только layoutWidth и layoutHeight, вы можете вырезать большую часть кода. 2: Этот метод растягивает видео, он НЕ сохраняет соотношение сторон. –

+0

Я исправил его, сделав размер Preview Camera, как в Ratio, Потому что мне нужен меньший размер предварительного просмотра камеры –

4

Есть два способа сделать изображение камеры заполнения весь экран.

  1. Akesh Dubey's answer, который отображает все изображение, растягивая его, чтобы соответствовать ширине и высоте макета. Однако соотношение сторон не сохраняется.
  2. Мой ответ ниже, который обрезает изображение, чтобы оно соответствовало без ущерба для соотношения сторон.

Для того, чтобы подбирать изображение, вам нужно всего лишь заменить один > на <. Найдите нижеследующий if-statement и измените условие следующим образом:

if (childHeight < layoutHeight) { 
    childHeight = layoutHeight; 
    childWidth = (int)(((float) layoutHeight/(float) height) * width); 
} 
+0

It Worked! Большое спасибо!! –

+0

Ваше решение лучше, чем любое другое, что я видел (и намного проще ...). У нас все еще есть проблема в любом случае (растяжка или обрезка), но в случае сканера QR-кода я бы сказал, что обрезка намного лучше. – Keysaw

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