【问题标题】:RotateFlipType helper functions?RotateFlipType 辅助函数?
【发布时间】:2012-01-24 23:03:59
【问题描述】:

我反复发现自己希望以更模块化的方式处理 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 并通过旋转或翻转来修改它以提供新值。

【问题讨论】:

  • 有很多重复值,例如 RotateNoneFlipNone 与 Rotate180FlipXY 完全相同。只有 8 个不同的值。使用反射器之类的工具来查看值。它使您可以从具有 8 个元素的数组创建一个小型查找表。
  • 我可以通过单击 Visual Studio 中的转到定义来查看 8 个不同的值。我仍然觉得和他们一起工作很痛苦。即使我单独存储每个值(旋转、翻转X 和翻转Y),将它们转换为枚举也很痛苦。看起来是一页又一页的 switch 语句。
  • 在谷歌查询中输入“查找表”并获得第一击。

标签: c# winforms image bitmap rotation


【解决方案1】:

我的方法是分别存储翻转和旋转,直到渲染的那一刻。我使用 RotateFlipType 作为翻转值,使用数字作为度数。我使用这些方法将它们组合成适当的 RotateFlipType 值。

我建议使用您自己的枚举而不是 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/吗?

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 2021-05-24
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多