如何在安卓系统中手动设置相机对焦值

3

我打算创建一个能够以以下方式拍照的应用程序:

  • 当用户触摸屏幕时,它开始拍照
  • 在几微秒内拍摄多张照片,每张照片的焦点不同

伪代码如下:

Camera camera = getAndroidCamera();
for(i<10)
{
  camera.setFocus(i*0.1);
  camera.takePhoto(path, pictureName+i);
}

基本上,我打算拍摄同一物体的不同对焦值照片。
根据这篇文章,手动对焦不可行,只能使用辅助自动对焦。
您能确认吗?
如果可能,我应该怎么做?应该将自动对焦设置为不同区域吗?
1个回答

0

答案 -- Android setFocusArea and Auto Focus

我所要做的就是取消之前调用的自动对焦。基本上,正确的操作顺序如下:

protected void focusOnTouch(MotionEvent event) {
    if (camera != null) {

        camera.cancelAutoFocus();
        Rect focusRect = calculateTapArea(event.getX(), event.getY(), 1f);
        Rect meteringRect = calculateTapArea(event.getX(), event.getY(), 1.5f);

        Parameters parameters = camera.getParameters();
        parameters.setFocusMode(Parameters.FOCUS_MODE_AUTO);
        parameters.setFocusAreas(Lists.newArrayList(new Camera.Area(focusRect, 1000)));

        if (meteringAreaSupported) {
            parameters.setMeteringAreas(Lists.newArrayList(new Camera.Area(meteringRect, 1000)));
        }

        camera.setParameters(parameters);
        camera.autoFocus(this);
    }}

......更新

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    ...
    Parameters p = camera.getParameters();
    if (p.getMaxNumMeteringAreas() > 0) {
       this.meteringAreaSupported = true;
    }
    ...
}

/**
 * Convert touch position x:y to {@link Camera.Area} position -1000:-1000 to 1000:1000.
 */
private Rect calculateTapArea(float x, float y, float coefficient) {
    int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();

    int left = clamp((int) x - areaSize / 2, 0, getSurfaceView().getWidth() - areaSize);
    int top = clamp((int) y - areaSize / 2, 0, getSurfaceView().getHeight() - areaSize);

    RectF rectF = new RectF(left, top, left + areaSize, top + areaSize);
    matrix.mapRect(rectF);

    return new Rect(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF.bottom));
}

private int clamp(int x, int min, int max) {
    if (x > max) {
        return max;
    }
    if (x < min) {
        return min;
    }
    return x;
}

这看起来很有趣。你能告诉我这段代码是做什么的吗?它专注于被点击的对象吗? - Nestor
是的,Android setFocusArea 和 Auto Focus。 - Ibrahim Sušić
这段代码是否属于GitHub上公开可用的项目?你能提供一个完整的示例项目吗? - Nestor
1
答案直接从这里复制粘贴:https://dev59.com/TWMl5IYBdhLWcg3wXWAT - Yar
原始问题是关于手动设置焦点,而这个答案复制粘贴了设置自动对焦的代码。与问题无关。 - Egal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接