根据给定的最大宽度和最大高度计算并保持纵横比,求宽度和高度。

3

我被要求将任何图片缩小为相应的缩略图,同时保持图片的原始宽高比。

到目前为止,我只能通过传递最大宽度来实现这一点,如下所示:

public static Size GetSizeAdjustedToAspectRatio(int sourceWidth, int sourceHeight, int dWidth, int dHeight)
{
    bool isLandscape = sourceWidth > sourceHeight;
    int fixedSize = dWidth;

    double aspectRatio = (double)sourceWidth / (double)sourceHeight; ;

    if (isLandscape)
        return new Size(fixedSize, (int)((fixedSize / aspectRatio) + 0.5));
    else
        return new Size((int)((fixedSize * aspectRatio) + 0.5), fixedSize);
}

我尝试了几种计算方法,以便它能接受任何给定的最大高度和最大宽度,以保持最终结果图片的原始纵横比。


你为什么要加上0.5? - undefined
要将数字四舍五入为整数,可以使用以下方法,这是在stackoverflow上找到的另一种解决方案,而不是使用Math.Round函数。 - undefined
那个解决方案是错误的:任意添加0.5并不会四舍五入,只是将值加上0.5。通过使用int的强制转换就足够了。如果你想要获得特定的行为,请依赖于一个函数(Math.Round或者Math.Ceiling/Math.Floor)。 - undefined
抛开这个问题,你的确切问题是什么?你的算法应该能够(或多或少)得到你想要的结果。也就是说,你根据旧尺寸计算给定的比例,并将此比例应用于新尺寸之一(宽度),以获得另一个尺寸(高度)。从逻辑上讲,新尺寸不能完全匹配目标值,否则比例就无法满足。与其总是选择宽度,你也可以根据数值选择高度;这是你的意思吗? - undefined
@varocarbas,我算法的问题在于我固定了值,就好像新的宽度和新的高度是相同的。例如,如果你有一张1600x800的图片,并且传入宽度为500和高度为800的参数,它将无法工作。我的目标是根据原始比例和最大宽度和最大高度来调整图片的大小(根据横向或纵向进行更改)。 - undefined
1个回答

4
这里是:
public static Size GetSizeAdjustedToAspectRatio(int sourceWidth, int sourceHeight, int dWidth, int dHeight) {
    bool isLandscape = sourceWidth > sourceHeight;

    int newHeight;
    int newWidth;
    if (isLandscape) {
        newHeight = dWidth * sourceHeight / sourceWidth;
        newWidth = dWidth;
    }
    else {
            newWidth = dHeight * sourceWidth  / sourceHeight;
            newHeight = dHeight;
    }

    return new Size(newWidth, newHeight);
}

在横屏模式下,您将缩略图宽度设置为目标框的宽度,并通过三角法计算高度。在竖屏模式下,您将缩略图高度设置为目标框的高度,并计算宽度。

读完你的回答后,我几乎感到有点不好意思。我一直在设想各种解决方案,而实际上它比我想象的要简单得多。 非常感谢你额外提供的解释! - undefined
@Hallaghan 首先,这段代码甚至无法编译通过(出于多种原因)。其次,在比率计算中,它混淆了图片和屏幕变量,因此我完全确定它不能达到你想要的效果。现在,El Marce对其进行了修正并成功编译通过;但是混淆问题仍然存在。 - undefined
当然,这就是要做的事情。OP的代码以一种相当奇怪的方式运行。抱歉,但是你的代码从一开始就是错误的,给我留下了一个不好的印象,快速浏览后发现你将变量放在了一个有点奇怪的顺序中。 - undefined
@varocarbas,我对这个答案的接受仅仅依赖于我的测试用例能够产生期望的结果,没有其他考虑。如果你认为这个解决方案不起作用,请详细说明。这个网站不仅仅是为了提问者,它还帮助了数百万寻找相同答案的人们。 - undefined
1
这个不是什么大问题,但是当你的帖子连编译都不通过的时候... 我就不会过于仔细地分析它了 -> 这也是为了发布正确的代码而发帖的另一个原因 :) - undefined
显示剩余8条评论

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