【问题标题】:How to set camera focus value manually in Android如何在Android中手动设置相机焦点值
【发布时间】:2015-07-24 07:50:39
【问题描述】:

我打算创建一个可以通过以下方式拍照的应用程序:

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

在伪代码中:

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

所以基本上我打算用不同的焦点值拍摄同一个物体的照片。

根据this的说法是不可能的,只有辅助自动对焦可行。

你能确认一下吗?

如果可能,我应该怎么做?我应该set autofocus to different areas吗?

【问题讨论】:

    标签: android android-camera


    【解决方案1】:

    回答——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;
    }
    

    【讨论】:

    • 这看起来很有趣。你能告诉我这段代码是做什么的吗?专注于被点击的对象?
    • 是的,Android setFocusArea 和自动对焦
    • 此代码是 GitHub 上任何公开可用项目的一部分吗?你能提供一个完整的示例项目吗?
    • 答案是从这里直接复制粘贴的:stackoverflow.com/questions/18460647/…
    • 最初的问题是关于手动设置焦点,这个答案有复制粘贴的代码来设置自动对焦。与问题无关。
    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 2021-01-04
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多