自定义相机旋转拍照角度

自定义相机拍照时有时会把手机倾斜着拍或者倒过来拍,怎么能在浏览拍摄的照片时看到的是一张正立的图片呢?

先利用传感器获得手机的拍照时的角度

 private SensorManager sm = null;
    private SensorEventListener sensorEventListener = new SensorEventListener() {
        public void onSensorChanged(SensorEvent event) {
            if (Sensor.TYPE_ACCELEROMETER != event.sensor.getType()) {
                return;
            }
            float[] values = event.values;
            angle = AngleUtil.getSensorAngle(values[0], values[1]);
        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };
public void registerSensorManager(Context context) {
    this.context = context;
    if (sm == null) {
        sm = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
    }
    sm.registerListener(sensorEventListener, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager
            .SENSOR_DELAY_NORMAL);
}

public void unregisterSensorManager(Context context) {
    if (sm == null) {
        sm = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
    }
    sm.unregisterListener(sensorEventListener);
}
工具类:旋转角度

public class AngleUtil {
    public static int getSensorAngle(float x, float y) {
        if (Math.abs(x) > Math.abs(y)) {
            /**
             * 横屏倾斜角度比较大
             */
            if (x > 7) {
                /**
                 * 左边倾斜
                 */
                return 270;
            } else if (x < -7) {
                /**
                 * 右边倾斜
                 */
                return 90;
            } else {
                /**
                 * 倾斜角度不够大
                 */
                return 0;
            }
        } else {
            if (y > 7) {
                /**
                 * 左边倾斜
                 */
                return 0;
            } else if (y < -7) {
                /**
                 * 右边倾斜
                 */
                return 180;
            } else {
                /**
                 * 倾斜角度不够大
                 */
                return 0;
            }
        }
    }
}

拍摄完照片之后

int nowAngle = (angle + 90) % 360;       matrix.setRotate(nowAngle);

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Qt自定义旋钮的旋转角度计算和限制旋转角度,可以按照以下步骤进行: 1. 定义一个QGraphicsEllipseItem作为旋钮的背景,并重载它的mousePressEvent、mouseMoveEvent和mouseReleaseEvent函数,以实现旋钮的拖拽和旋转功能。 2. 在mousePressEvent中,记录下鼠标点击时的位置坐标,并计算出旋钮中心点的坐标。 3. 在mouseMoveEvent中,计算出当前鼠标位置和旋钮中心点的向量,并计算出当前角度(可以使用Qt的QLineF类的angleTo函数来计算两个向量之间的夹角)。 4. 如果需要限制旋钮的旋转角度,则可以在此处加入判断,判断当前角度是否超出限制范围,并进行相应的处理(如强制将角度设置为最大或最小值)。 5. 在mouseReleaseEvent中,将当前角度保存下来,并发射一个信号通知外部对象旋钮的值已经改变。 下面是一个简单的示例代码,演示如何实现一个带有角度限制的Qt自定义旋钮: ```cpp class CustomKnob : public QGraphicsEllipseItem { public: CustomKnob(qreal x, qreal y, qreal width, qreal height, QGraphicsItem* parent = nullptr) : QGraphicsEllipseItem(x, y, width, height, parent) { setFlag(ItemIsMovable); setFlag(ItemSendsGeometryChanges); setAcceptHoverEvents(true); setZValue(1); } void mousePressEvent(QGraphicsSceneMouseEvent* event) override { m_startPos = event->pos(); m_centerPos = this->boundingRect().center(); } void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override { QPointF delta = event->pos() - m_centerPos; qreal angle = QLineF(0, 0, delta.x(), delta.y()).angle(); // 限制旋钮的旋转角度 if (angle > m_maxAngle) angle = m_maxAngle; else if (angle < m_minAngle) angle = m_minAngle; this->setRotation(angle); emit valueChanged(angle); } void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override { QPointF delta = event->pos() - m_centerPos; qreal angle = QLineF(0, 0, delta.x(), delta.y()).angle(); m_value = angle; } void setRange(qreal minAngle, qreal maxAngle) { m_minAngle = minAngle; m_maxAngle = maxAngle; } qreal value() const { return m_value; } signals: void valueChanged(qreal value); private: QPointF m_startPos; QPointF m_centerPos; qreal m_minAngle = 0; qreal m_maxAngle = 360; qreal m_value = 0; }; ``` 在使用自定义旋钮时,可以通过setRange函数设置旋钮的角度限制,并通过value和valueChanged信号获取和设置旋钮的值。例如: ```cpp CustomKnob* knob = new CustomKnob(0, 0, 100, 100); knob->setRange(0, 180); connect(knob, &CustomKnob::valueChanged, [](qreal value) { qDebug() << "knob value:" << value; }); qDebug() << "current knob value:" << knob->value(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值