Camera2 захватить изображение отличается с предварительным просмотром - PullRequest
0 голосов
/ 26 декабря 2018

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

  1. до съемки before capture

  2. после захвата

after capture

что не так?и что я делаю.спасибо

1 Ответ

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

Это класс AutoFitTextView, который я извлек из примера Google.Вы можете посмотреть на здесь .Он нацелен на то, чтобы показать вид с камеры и сконфигурировать базу соотношения физических размеров устройства.

public class AutoFitTextureView extends TextureView {

    private int mRatioWidth = 0;
    private int mRatioHeight = 0;

    // Some codes here...

    public void setAspectRatio(int width, int height) {
        if (width < 0 || height < 0) {
            throw new IllegalArgumentException("Size cannot be negative.");
        }
        mRatioWidth = width;
        mRatioHeight = height;
        requestLayout();
    }

    @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);
            } else {
                setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
            }
        }
    }
}

В этом классе есть 2 пункта:

  1. Невозможно обеспечить правильное соотношение в каждом устройстве .Однако мы можем выбрать оптимизированный размер, который уже определен в этом классе .
  2. Это неправильное условие: if (width < height * mRatioWidth / mRatioHeight).Это должно быть > , потому что когда ширина больше высоты, мы вычисляем и устанавливаем размер измерения на основе ширины (не высоты).

ОБНОВЛЕНО

Если вы просто хотите, чтобы каждое устройство работало должным образом в определенном соотношении, установите для него жесткое соотношение (например: 4/3)

Этого можно добиться, заменив эти строки кода:

mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class),
                        rotatedPreviewWidth, rotatedPreviewHeight, maxPreviewWidth,
                        maxPreviewHeight, largest);

-> previewSize = Size(4, 3)
...