Android9的camera api1设置镜像和旋转

文章介绍了如何在Android的framework层修改CameraClient.cpp中的getOrientation函数,以添加对USB摄像头的旋转和镜像翻转控制。通过调整系统属性`persist.usbcamera.orientation`和`persist.usbcamera.flip`,可以在不修改应用层代码的情况下,实现水平、垂直镜像和不同角度的旋转功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用usb camera的时候,想在系统设置里面增加一个开关,控制camera的水平镜像、垂直镜像、旋转等,希望在framework层来做而不是在应用层,找了很多资料也问了gpt,最终发现是在frameworks\av\services\camera\libcameraservice\api1\CameraClient.cpp中修改getOrientation函数,修改代码如下:

int CameraClient::getOrientation(int degrees, bool mirror) {
    // if (!mirror) {
    //     if (degrees == 0) return 0;
    //     else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
    //     else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
    //     else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
    // } else {  // Do mirror (horizontal flip)
    //     if (degrees == 0) {           // FLIP_H and ROT_0
    //         return HAL_TRANSFORM_FLIP_H;
    //     } else if (degrees == 90) {   // FLIP_H and ROT_90
    //         return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
    //     } else if (degrees == 180) {  // FLIP_H and ROT_180
    //         return HAL_TRANSFORM_FLIP_V;
    //     } else if (degrees == 270) {  // FLIP_H and ROT_270
    //         return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
    //     }
    // }
    char orientation[PROPERTY_VALUE_MAX];
    // 获取usb摄像头旋转配置属性
    property_get("persist.usbcamera.orientation", orientation, "");
    ALOGE("lzq777 ->  persist.usbcamera.orientation=%s,", orientation);
    
    if (strcmp(orientation, "90") == 0) {
        degrees = degrees + 90;
    }else if (strcmp(orientation, "180") == 0) {
        degrees = degrees + 180;
    }else if (strcmp(orientation, "270") == 0) {
        degrees = degrees + 180;
    }
    
    if (degrees >= 360) {
        degrees = degrees - 360;
    }

    char flip[PROPERTY_VALUE_MAX];
    // 获取usb摄像头镜像配置属性
    property_get("persist.usbcamera.flip", flip, "");
    ALOGE("lzq777 ->  persist.usbcamera.flip=%s,", flip);
    // 不进行镜像
    if (strcmp(flip, "0") == 0) {
        if (degrees == 0) return 0;
        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
    } 
    // 水平镜像翻转
    else if (strcmp(flip, "1") == 0){
        if (degrees == 0) {           // FLIP_H and ROT_0
            return HAL_TRANSFORM_FLIP_H;
        } else if (degrees == 90) {   // FLIP_H and ROT_90
            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
        } else if (degrees == 180) {  // FLIP_H and ROT_180
            return HAL_TRANSFORM_FLIP_V;
        } else if (degrees == 270) {  // FLIP_H and ROT_270
            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
        }
    } 
    // 垂直镜像翻转
    else if (strcmp(flip, "2") == 0){
        if (degrees == 0) {           // FLIP_H and ROT_0
            return HAL_TRANSFORM_FLIP_V;
        } else if (degrees == 90) {   // FLIP_H and ROT_90
            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
        } else if (degrees == 180) {  // FLIP_H and ROT_180
            return HAL_TRANSFORM_FLIP_H;
        } else if (degrees == 270) {  // FLIP_H and ROT_270
            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
        }
    }

    ALOGE("Invalid setDisplayOrientation degrees=%d", degrees);
    return -1;
}

以上属性配置可自行配置到system.prop当中,然后在settings里面修改属性即可

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值