Проблема с Camera2 API - PullRequest
       46

Проблема с Camera2 API

0 голосов
/ 28 декабря 2018

Я делаю некоторые приложения для камеры, использую camera2 APi пример camera2 api google sample, поэтому вывод моей камеры не полный экран

Autofit texture view not full screen

, затем я читаю с камеры2API, чтобы решить, что я должен изменить это в Onmeasure в классе AUtofitTextureView:

if (width < height * mRatioWidth / mRatioHeight) {

от <до> так как здесь:

 if (width > height * mRatioWidth / mRatioHeight) {

тогда мой вид камеры исправить на весь экран camera preview full scren

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

, пожалуйста, проверьте мой снимок экрана из моего приложения

  1. просмотр моей камеры не в полноэкранном режиме

sdsds

мое изображение захвата, если предварительный просмотр камеры не на весь экран

sdsdds 3. предварительный просмотр моей камеры на весь экран после изменения метода досуга

sdsdsd

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

проблема в том, что мое изображение захвата не совпадает с моим предварительным просмотром камеры

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Я пытался следующим образом, здесь я делюсь своим кодом для поддержания соотношения сторон 16: 9,18: 9,19: 9. надеюсь, что этот ответ поможет, основываясь на выборе разрешения устройства ArrayList иметь максимумминимальное разрешение. Таким образом я решаю проблему растяжки предварительного просмотра.

//Samsung-S6-choices[0]
//Samsung-S7-edge-choices[6]
//OnePlus-5T-choices[15]
/*
 * Given {@code choices} of {@code Size}s supported by a camera, chooses the smallest one whose
 * width and height are at least as large as the respective requested values, and whose aspect
 * ratio matches with the specified value.
 *
 * @param choices     The list of sizes that the camera supports for the intended output class
 * @param width       The minimum desired width
 * @param height      The minimum desired height
 * @param aspectRatio The aspect ratio
 * @return The optimal {@code Size}, or an arbitrary one if none were big enough
 */
private  Size chooseOptimalSize(Size[] choices, int width, int height, Size aspectRatio) {
    // Collect the supported resolutions that are at least as big as the preview Surface
    List<Size> bigEnough = new ArrayList<>();
    int w = aspectRatio.getWidth();
    int h = aspectRatio.getHeight();
    double ratio = (double) h / w;
    int loopCounter=0;
    for (Size size : choices) {
        int orientation = getActivityContext.getResources().getConfiguration().orientation;
        if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
            //if((size.getWidth()/16) == (size.getHeight()/9) && size.getWidth() <=720) {
            //if((size.getWidth()/16) == (size.getHeight()/9) && size.getWidth() <=3840 ) {
            //if((size.getWidth()/16) == (size.getHeight()/9) && size.getWidth() <=5120 ) {//Retina 5K
            if((size.getWidth()/16) == (size.getHeight()/9) && size.getWidth() <=7680 ) {//8K UHDTV Super Hi-Vision
                Log.e(TAG1, "chooseOptimalSize:"+size);
                return size;
            }
        } else {
            Log.e(TAG1, "chooseOptimalSize:--given--"+size);
            DisplayMetrics metrics = getActivityContext.getResources().getDisplayMetrics();
            float mCameraAspectRatio = ((float)metrics.heightPixels / (float)metrics.widthPixels);
            Log.e(TAG1, "chooseOptimalSize:--AspectRatio--"+mCameraAspectRatio);
            if((size.getWidth()/16) == (size.getHeight()/9) && ((size.getWidth() <=1280)||(size.getHeight()<=1920))) {
                //if((size.getWidth()/16) == (size.getHeight()/9) && (size.getWidth() <=4320 ) ) {//8K UHDTV Super Hi-Vision
                //if((size.getWidth()/16) == (size.getHeight()/9) && (size.getWidth() <=2880 ) ) {//Retina 5K
                //if((size.getWidth()/16) == (size.getHeight()/9) && (size.getWidth() <=2160 ) ) {
                //if((size.getWidth()/16) == (size.getHeight()/9) && (size.getWidth() <=1280 ) ) {
                //if((size.getWidth()/16) == (size.getHeight()/9) && (size.getWidth() <=4480 && size.getWidth() >=1280) ) {
                Log.e(TAG1, "chooseOptimalSize:"+size+"-16:9");
                return size;
            }else if((size.getWidth()/18) == (size.getHeight()/9) && ((size.getWidth() <=3840)||(size.getHeight()<=2160))) {
                Log.e(TAG1, "chooseOptimalSize:"+size+"-18:9");
                return size;
            }else if((size.getWidth()/18.5) == (size.getHeight()/9) && ((size.getWidth() <=3840)||(size.getHeight()<=2160))) {
                Log.e(TAG1, "chooseOptimalSize:"+size+"-18.5:9");
                return size;
            }else if((size.getWidth()/19) == (size.getHeight()/9) && ((size.getWidth() <=3840)||(size.getHeight()<=2160))) {
                Log.e(TAG1, "chooseOptimalSize:"+size+"-19:9");
                return size;
            }else if((size.getWidth()/19.5) == (size.getHeight()/9) && ((size.getWidth() <=3840)||(size.getHeight()<=2160))) {
                Log.e(TAG1, "chooseOptimalSize:"+size+"-19.5:9");
                return size;
            }else{
                Log.e(TAG1, "chooseOptimalSize"+" not proper aspect resolution");
                Log.e(TAG1, "chooseOptimalSize"+" ---=>Width---=>"+size.getWidth());
                Log.e(TAG1, "chooseOptimalSize"+" ---=>Height---=>"+size.getHeight());
            }
            //2340
        }

        if(screenWidth==size.getWidth()){
            Log.e(TAG1, loopCounter+".choose:width Matched:"+screenWidth+"="+size.getWidth());
        }else{
            Log.e(TAG1, loopCounter+".choose:width Not Matched:"+screenWidth+"="+size.getWidth());
        }

        if(screenHeight==size.getHeight()){
            Log.e(TAG1, loopCounter+".choose:height Matched:"+screenHeight+"="+size.getHeight());
        }else{
            Log.e(TAG1, loopCounter+".choose:height Not Matched:"+screenHeight+"="+size.getHeight());
        }
        loopCounter++;
    }
    // Pick the smallest of those, assuming we found any
    if (bigEnough.size() > 0) {
        return Collections.min(bigEnough, new CompareSizesByArea());
    } else {
        Log.e(TAG1, "Couldn't find any suitable preview size");
        return choices[0];
    }
}


/*
 * Compares two {@code Size}s based on their areas.
 */
static class CompareSizesByArea implements Comparator<Size> {
    @Override
    public int compare(Size lhs, Size rhs) {
        // We cast here to ensure the multiplications won't overflow
        return Long.signum((long) lhs.getWidth() * lhs.getHeight() -
                (long) rhs.getWidth() * rhs.getHeight());
    }
}

Надеюсь, это поможет, оставьте комментарий, если возникнет какая-либо проблема.

0 голосов
/ 05 января 2019

Я решаю эту проблему следующим образом: 1. изменить представление Autovit Textture с> на <2. удалить метод вызова mTexttureview.setaspectrasio () 3. изменить метод getOptimalSize на новый метод Пример: </p>

private static Size chooseVideoSize(Size[] choices) {
    for (Size size : choices) {
        if (size.getWidth() == size.getHeight() * 4 / 3 && size.getWidth() <= 1080) {
            return size;
        }
    }
    Log.e(TAG, "Couldn't find any suitable video size");
    return choices[choices.length - 1];
}

и измените mPreviewSize = на подобное

mPreviewSize = chooseVideoSize (map.getOutputSizes (SurfaceTexture.class));

...