RotateFlipType辅助对象功能

本文关键字:功能 对象 RotateFlipType | 更新日期: 2023-09-27 18:21:31

我一再发现自己想要以更模块化的方式处理RotateFlipType。

例如,在任何给定的时间,我都希望存储一个RotateFlipType枚举,同时允许用户访问按钮,以便一次单击一次即可翻转和旋转。稍后当我需要将RotateFlipType应用于数据时,我需要存储此信息。

所以基本上,我需要将所有内容分别存储在多个变量中。或者我需要有这样的逻辑:

private RotateFlipType ApplyHorizontalFlip(RotateFlipType oldFlip)
{
    switch (oldFlip)
    {
        case RotateFlipType.Rotate180FlipNone:
            return RotateFlipType.RotateNoneFlipNone;
        case RotateFlipType.Rotate180FlipX:
            return RotateFlipType.RotateNoneFlipX;
        case RotateFlipType.Rotate180FlipXY:
            return RotateFlipType.RotateNoneFlipXY;
        case RotateFlipType.Rotate180FlipY:
            return RotateFlipType.RotateNoneFlipY;
        case RotateFlipType.Rotate270FlipNone:
            return RotateFlipType.Rotate90FlipNone;
        // etc...
    }
}

框架中是否内置了任何辅助方法,或者有人知道吗?基本上是采用任何现有的RotateFlipType,并通过旋转或翻转对其进行修改以获得新值。

RotateFlipType辅助对象功能

我的方法是在渲染之前分别存储翻转和旋转。翻转值使用RotateFlipType,度数使用数字。我使用这些方法将它们组合为适当的RotateFlipType值。

我建议使用您自己的enum,而不是像我在这里所做的那样使用RotateFlipType,尤其是当它作为外部API公开时。

    private double normalizeTo90Intervals(double d){
        d = d % 360; //Coalesce multiples
        if (d < 0) d += 360; //Force positive
        //Use manual rounding
        if (d >= 315 && d < 360) return 0;
        if (d >= 0 && d < 45) return 0;
        if (d >=45 && d < 135) return 90;
        if (d >= 135 && d < 225) return 180;
        if (d >= 225 && d < 315) return 270;
        return 0; //to make compiler happy
    }
    private RotateFlipType combineFlipAndRotate(RotateFlipType flip, double angle) {
        angle = normalizeTo90Intervals(angle);
        if (flip == 0) return (RotateFlipType)(int)(angle / 90);
        else if (flip == (RotateFlipType)4) return (RotateFlipType)(int)(4 + (angle / 90));
        else if (flip == (RotateFlipType)6) {
            if (angle == 0) return (RotateFlipType)6;
            if (angle == 90) return (RotateFlipType)7;
            if (angle == 180) return (RotateFlipType)4;
            if (angle == 270) return (RotateFlipType)5;
        } else if (flip == (RotateFlipType)2) {
            if (angle == 0) return (RotateFlipType)2;
            if (angle == 90) return (RotateFlipType)3;
            if (angle == 180) return (RotateFlipType)0;
            if (angle == 270) return (RotateFlipType)1;
        }
        throw new ArgumentException("Valid flip values are RotateNoneFlipNone, RotateNoneFlipX, RotateNoneFlipY, and RotateNoneFlipXY. Rotation must be specified with Rotate or srcRotate instead. Received: " + flip.ToString());
    }

仅供参考,你听说过吗http://imageresizing.net/?