Как получилось, что предварительный просмотр камеры в текстурном представлении намного более нечеткий, чем в плане поверхности?

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

То, что я подразумеваю под нечетким, - это то, что в виде текстуры вы можете видеть пиксели, особенно при масштабировании. Это не тот случай, когда используется обзор поверхности. Почему это так?

Ответ 1

UPD: Извините, но после того, как я переписал свой дерьмовый код, ключом является слишком маленький размер предварительного просмотра, который вызвал "размытость", поэтому вы должны установить разумный размер предварительного просмотра, а не причину зачеркивания ниже, но рекомендуется автофокус...

Size size = getBestSupportSize(parameters.getSupportedPreviewSizes(), width, height);
parameters.setPreviewSize(size.width, size.height);

Что касается метода getBestSupportSize(), как получить bestSize для ваших потребностей проекта, в этом случае он равен ширине экрана и его соотношению 4/3, может быть и другим, я вычисляю соотношение деления width/height,

 private Size getBestSupportSize(List<Size> sizes, int width, int height) {
    Size bestsize = sizes.get(0);
    int screenWidth = getResources().getDisplayMetrics().widthPixels;
    int dt = Integer.MAX_VALUE;
    for (int i = sizes.size() - 1; i >= 0; i--) {
        Log.d(TAG, "-index : " + i);
        Size s = sizes.get(i);
        if (s.width * 3.0f / 4 == s.height) {
            int newDT = Math.abs(screenWidth - s.width);
            if (newDT < dt && screenWidth < s.width) {
                dt = newDT;
                bestsize = s;
            }
        }
    }
    return bestsize;//note that if no "4/3" size supported,default return size[0]
}

Так что эта "нечеткость" была вызвана небольшим previewSize, вычисляющим лучший размер для камеры, используя этот getSupportedPreviewSizes()


И я буду держать фрагмент autoFocus ниже, зачеркнут, хотя, если нужно, БЮР.


Ну, я получил решение для этой "нечеткой" проблемы, и в моем случае я просто использую TextureView и surfaceTexture чтобы сделать снимок вместо старого surfaceView с surfaceHolder.

Ключ устанавливается в этом mCamera.autofocus(), поэтому картинка "нечеткая", потому что у нас нет этой настройки автофокуса. как ниже:

mCamera.setPreviewTexture(surface);

//enable autoFocus  if moving   
mCamera.setAutoFocusMoveCallback(new AutoFocusMoveCallback() {

    @Override
    public void onAutoFocusMoving(boolean start, Camera camera) {

        if (start) {  //true means you are moving the camera  

            mCamera.autoFocus(myAutoFocus);

        }
    }
});
mCamera.startPreview();

autoFocusCallback как это:

AutoFocusCallback myAutoFocus = new AutoFocusCallback() {

    @Override
    public void onAutoFocus(boolean success, Camera camera) {

    }
};