在保持纵横比和舍入到整数的同时调整大小

时间:2011-11-07 15:28:58

标签: c# image resize aspect-ratio

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

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

我现在正在做的是取两个值中的较大值(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“偏移”值。

2 个答案:

答案 0 :(得分:2)

使offset.X,.Y和AspectRatio浮动/加倍,执行您需要的任何计算,并且只计算一次新的大小将其四舍五入为整数。
这样你就可以获得最大的精确度。

P.S。 使用Math.Round而不是简单地转换为int,这将获得一些额外的精度。

答案 1 :(得分:1)

  

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

要么你的宽高比,裁剪或厚实的大小调整都不完美。想一想:

使用3:4的宽高比,您可以水平缩放的最小尺寸是多少,并且仍然与原始比例完美匹配?

四个像素。

现在将宽高比更改为两个大质数,您将看到问题。

除此之外,您可以在一个维度上裁剪图像,或者使用图像过滤进行插值,并使用不太完美的宽高比更改。

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

相关问题