4

我允许用户在尝试保持图像的原始纵横比的同时调整图像大小。

对于每个调整大小操作,我都有一个“偏移”变量,它指示宽度和高度的变化。这是基于鼠标移动的,因此它可以是值的任意组合,具体取决于它们在调整大小时移动鼠标的程度。

我现在正在做的是取两个值中较大的一个(x 和 y 变化)并使用它来计算相同纵横比的另一个值。这是我的代码:

if (Math.Abs(offset.X) > Math.Abs(offset.Y))
{
    offset.Y = (int)(offset.X / AspectRatio);
}
else
{
    offset.X = (int)(offset.Y * AspectRatio);
}

纵横比是标准的宽度/高度值。

我的代码的问题是它使用整数值,所以它是四舍五入并导致纵横比扭曲。

我假设我需要做的是捕捉到可以被纵横比整除的整数值,或者为此目的。但我不知道如何通过修改这些 x 和 y “偏移”值来做到这一点。

4

2 回答 2

2

使 offset.X,.Y 和 AspectRatio 浮点数/双精度数,进行所需的任何计算,并且只有在计算出新大小后才将其舍入为整数。
这样,您将获得尽可能高的精度。

PS 使用 Math.Round 而不是简单地转换为 int,这将为您带来一些额外的精度。

于 2011-11-07T15:39:34.103 回答
1

我假设我需要做的是捕捉到可以被纵横比整除的整数值,或者为此目的。但我不知道如何通过修改这些 x 和 y “偏移”值来做到这一点。

要么你将有一个不完美的纵横比、裁剪或大块调整大小。想想这个:

在 3:4 的纵横比下,您可以水平缩放并仍与原始比例完美匹配的最小尺寸是多少?

四个像素。

现在将纵横比更改为两个大素数,您会发现问题所在。

取而代之的是,您可以在一维中裁剪图像,或者使用图像过滤进行插值,并忍受不太完美的纵横比变化。

确保你的计算是正确的。将您的纵横比计算为浮点值,并仅在最终计算时截断为整数。否则你会有双舍入错误。

于 2011-11-07T15:37:19.033 回答