光学防抖(OIS)是移动影像中抵消手抖、提升暗光成片率的关键能力。在过去,OIS 通常被系统底层 ISP 封装成固定能力,开发者只能控制开关。而在 HarmonyOS 6.1.1(API 24)中,Camera Kit 开放了更底层的 OIS 控制权:通过 OISQuery 和 OIS 接口组,你可以查询相机在俯仰轴(Pitch)和偏航轴(Yaw)上的硬件偏置范围与步长,甚至注入自定义偏置值,让镜头根据你的算法产生物理位移,实现像素级防抖补偿。
本次 Camera Kit 将防抖能力拆分为 OISQuery(查询模块)和 OIS(设置模块),均在 Stage 模型下使用。查询侧主要接口包括:isOISModeSupported(mode) 检测指定模式是否可用;getSupportedOISBiasRange(oisAxis) 返回指定轴的硬件偏置极值;getSupportedOISBiasStep(oisAxis) 返回电机的最小步长;getCurrentOISMode() 和 getCurrentCustomOISBias(oisAxis) 用于回读当前状态。设置侧接口则有 setOISMode(mode) 切换普通模式或自定义模式,以及 setOISModeCustom(pitch, yaw) 直接注入偏置值。对于 C/C++ 开发者,还可以使用 OH_CaptureSession_SetOISModeCustom(session, pitchBias, yawBias) 直接向 CaptureSession 推送防抖参数,避免跨语言桥接损耗。
在 Demo 工程中,新增了 CameraOISDemo 页面,包含三块功能:能力勘测面板、参数注入引擎、状态回溯与校验。下面是一段 ArkTS 示例,演示从探测到注入的主要流程。
- import { router } from '@kit.ArkUI';
- // 真实开发中应解构 @kit.CameraKit 获取 OISMode / OISAxes
- // import { camera } from '@kit.CameraKit';
- @Entry
- @Component
- struct CameraOISDemo {
- @State logs: string[] = [];
- @State pitchValue: number = 0;
- @State yawValue: number = 0;
- // 模拟枚举
- private OISAxes_X = 0; // X轴 / Pitch
- private OISAxes_Y = 1; // Y轴 / Yaw
- private OISMode_CUSTOM = 2; // 模拟 CUSTOM 模式
- private appendLog(msg: string): void {
- let now = new Date();
- let timeStr = `${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}.${now.getMilliseconds()}`;
- this.logs.unshift(`[${timeStr}] ${msg}`);
- }
- checkOISCapabilities(): void {
- this.appendLog('🔍 开始对当前主摄镜头进行 OIS 硬件勘测...');
- // 真实业务中: let isCustomSupported = photoSession.isOISModeSupported(camera.OISMode.CUSTOM);
- let isCustomSupported = true; // 模拟通过
- if (isCustomSupported) {
- this.appendLog('✅ 设备支持自定义 OIS 偏置模式 (CUSTOM)');
- // 真实业务中: photoSession.getSupportedOISBiasRange(camera.OISAxes.OIS_PITCH);
- let pitchRange = [-1.5, 1.5];
- let pitchStep = 0.1;
- this.appendLog(`📊 Pitch 轴支持范围: [${pitchRange[0]}, ${pitchRange[1]}], 步进: ${pitchStep}`);
- } else {
- this.appendLog('⚠️ 设备不支持 OIS CUSTOM 模式。');
- }
- }
- enableCustomOISMode(): void {
- this.appendLog('⚙️ 正在调用 PhotoSession.setOISMode(CUSTOM)...');
- // 真实业务中: photoSession.setOISMode(camera.OISMode.CUSTOM);
- this.appendLog('✅ 已成功挂载自定义防抖模式');
- }
- injectCustomBias(): void {
- this.appendLog(`🚀 正在向底层注入防抖补偿参数 -> Pitch: ${this.pitchValue.toFixed(2)}, Yaw: ${this.yawValue.toFixed(2)}`);
- // 真实业务中: photoSession.setOISModeCustom(this.pitchValue, this.yawValue);
- this.appendLog('✅ 参数注入成功,镜片已产生物理位移补偿。');
- }
- build() {
- Column() {
- // 详见工程源码中滑动条等交互 UI 的实现...
- }
- .width('100%').height('100%').backgroundColor(Color.White)
- }
- }
复制代码
代码中,checkOISCapabilities 先确认设备是否支持 CUSTOM 模式,并取得 Pitch 轴范围与步长;enableCustomOISMode 切换防抖模式;injectCustomBias 注入参数。注意真实业务中需要从 @kit.CameraKit 解构 camera 对象,通过 photoSession 调用相应 API。运行后,控制台会输出日志,展示当前设备的 OIS 能力与注入过程。
需要特别留意三点:第一,OIS 是硬件能力,不同设备支持情况不同,调用 set 前必须先执行 isOISModeSupported 等探测,否则容易抛出 7400102(Operation not allowed)。第二,注入偏置值不能超出 getSupportedOISBiasRange 返回的范围,否则轻则报错,重则影响对焦算法。第三,所有 OIS 设置都依附于 CaptureSession 或 PhotoSession,Session 未 commitConfig() 之前调用会返回 7400103(Session not config)。
HarmonyOS 6.1.1 将 OIS 底层操纵能力开放给应用层,对专业影像工具、稳定器、运动相机等场景意义重大。开发者可以结合陀螺仪数据与 setOISModeCustom 接口,实现超越系统原生的防抖效果。 |