在某些设备(仅限较新的 Android)中,支持点测光。您可以使用由单独的计时器线程(如 AsyncTask)触发的 JPEG 回调,然后读取将测量到选择点的 EXIF 信息。要检查这是否可用,您可以使用:
//on Event Touch callback on your SurfaceView
x=event.getX();
y=event.getY();
params=camera.getParameters();
... //check for rotation, calculate focus point (x, y: -1000, 1000)
if(params.getMaxNumMeteringAreas() > 0){
//draw a meter area, however big you want, 1000 is weight (0-1000)
Camera.Area ca=new Area(new Rect(x-25, y-25, x+25, y+25), 1000);
List<Camera.Area> areas=new ArrayList<Area>();
areas.add(ca);
params.setFocusAreas(areas);
params.setMeteringAreas(areas);
camera.setParameters(params);
}else{
//process the Bitmap and do the below...
}
在较旧的设备上(如果您想要向后兼容),您仍然可以设置一个焦点(存储在您的代码中),然后与 EXIF 值相比,对该焦点周围的像素进行平均(我使用 6% 的宽度和高度) (如果它更暗,降低曝光等)。为此,您可能需要使用一键式按钮(因为旧设备在执行 JPEG 回调时会滞后)。
average=((r+g+b)/3-128)/256
myEV=myEV+myEV*average
使用这两种方法,只需确保您正在阅读的图像正确旋转(您可以通过将其放入 ImageView 并将其与预览进行比较来检查)。
从 EV,您可以相对容易地转换为 Lux 或 Foot Candles(或任何您喜欢的测量值)。