保持纵横比并四舍五入至偶数整数的调整大小

5
我正在允许用户调整图像大小,同时试图保持原始宽高比。
对于每个调整操作,我有一个“偏移”变量,用于指示宽度和高度的变化。这取决于鼠标移动的距离,因此可能是任意组合的值,取决于他们在调整大小时移动了多少。
现在我正在取两个值中的较大值(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 “偏移”值来实现。


2021年了,纵横比终于来了,不需要使用任何技巧了。 - Dr. Freddy Dimethyltryptamine
2个回答

2

将offset.X,.Y和AspectRatio更改为浮点数/双精度数,进行所需的计算,仅在计算出新尺寸后将其舍入为整数。
这样您就可以获得最大可能的精度。

P.S. 请使用Math.Round而不是简单地强制转换为int,这将为您增加一些额外的精度。


+1;这是进行最终尺寸计算的正确方法。至于“额外精度”,这并不完全正确。它不会给你更多的精度,但肯定会减少你的四舍五入误差。 - Merlyn Morgan-Graham

1
我认为我需要做的是将偏移值调整为能够被宽高比均匀整除的整数值,或者类似的方法。但我不知道如何通过修改这些x和y“偏移”值来实现。
要么你会有一个不完美的宽高比舍入、裁剪或粗糙的调整。想一想:
对于3:4的宽高比,你可以水平缩放的最小尺寸是多少才能完全匹配原始比例?
四个像素。
现在把你的宽高比改成两个大质数,你就会看到问题了。
与此相反,你可以在一个维度上裁剪图像,或者使用图像过滤进行插值,并接受不完全完美的宽高比变化。
确保你的计算是正确的。将宽高比计算为浮点值,并仅在最终计算时截断为整数。否则,你将会有双重舍入误差。

1
你说得对,使用整数是不可行的。我可以将其转换为浮点数,以便存储宽度/高度并绘制图像。 - Trevor Elliott
Svarog提出了一个很好的观点,即Math.Round可以给你略微更准确的答案。虽然他们没有给出任何理由,但他们确实提出了关于最终应该做什么的好建议 - 所以确保你也进行四舍五入 :) - Merlyn Morgan-Graham
关于Math.Round给出稍微更准确答案的观点,@svarog没有给出任何理由。这里是理由 - @svarog的回答说:“P.S.使用Math.Round而不是简单地转换为int,这将为您获得一些额外的精度。” - 转换会丢弃非整数部分,而四舍五入则移动到最接近的整数。例如,转换为int将把1.234和1.987都变成整数1,而Math.Round将为相同情况产生1和2。 - codingoutloud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接