我多次发现自己想要以更加模块化的方式处理 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 值。
我建议使用您自己的枚举而不是像我在这里所做的那样,特别是如果它作为外部 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/吗?
这对我来说效果很好:
public static RotateFlipType RotateLeft(RotateFlipType rotateFlip)
{
int rotate = (int)rotateFlip % 4;
int flip = (int)rotateFlip / 4;
return (RotateFlipType)((rotate + (flip == 0 ? 3 : 1)) % 4 + flip * 4);
}
public static RotateFlipType RotateRight(RotateFlipType rotateFlip)
{
int rotate = (int)rotateFlip % 4;
int flip = (int)rotateFlip / 4;
return (RotateFlipType)((rotate + (flip == 0 ? 1 : 3)) % 4 + flip * 4);
}
public static RotateFlipType FlipHorizontal(RotateFlipType rotateFlip)
{
int rotate = (int)rotateFlip % 4;
int flip = (int)rotateFlip / 4;
return (RotateFlipType)(rotate + (1 - flip) * 4);
}
public static RotateFlipType FlipVertical(RotateFlipType rotateFlip)
{
int rotate = (int)rotateFlip % 4;
int flip = (int)rotateFlip / 4;
return (RotateFlipType)((rotate + 2) % 4 + (1 - flip) * 4);
}