代码之家  ›  专栏  ›  技术社区  ›  Tom Gullen

将图像大小调整为最大高度和最大宽度边界的数学方法

  •  2
  • Tom Gullen  · 技术社区  · 14 年前

    给定图像:

    maxWidth = 400;
    maxHeight = 200;
    width = photo.Width;
    height = photo.Height;
    

    如果任何一个维度超过最大属性,我将如何缩放图像?

    以下是一些测试用例:

    300x300  :   Too tall, but width ok.
    500x200  :   Too wide, but height ok.
    650x300  :   Too tall and too wide
    300x190  :   Fine, don't resize
    

    我很难把这个数学形象化,如果太简单的话,对不起!给我带来最大麻烦的情况是两个尺寸都超过了允许的最大值。

    3 回复  |  直到 14 年前
        1
  •  11
  •   Marcelo Cantos    14 年前

    分别计算所需的垂直和水平缩放比例,然后选择两者中较小的一个,并将结果钳制到最大值1。在代码中:

    scale = min(1, min(maxWidth/photo.Width, maxHeight/photo.Height))
    

    确保除法运算使用浮点运算。如何做到这一点因语言而异。在C/Java/C语言及其ILK中,抛出一个操作数进行浮点运算。

        2
  •  2
  •   rwong    14 年前

    计算两个比率(带浮点结果):

    • 输入宽度除以最大允许宽度
    • 输入高度除以最大允许高度

    然后,

    • 如果两个比率都为1.0,则不要调整大小。
    • 如果比率为1.0,则按该系数缩小。
    • 如果两个比率都大于1.0,则按两个因素中较大的一个缩小。
        3
  •  0
  •   Kim Alders    14 年前

    我的数学很糟糕,但是,假设你想要一个比例尺度,我会这样求解:

    if maxWidth < photo.Width
        width = 'too big'
    if maxHeight < photo.Height
        height = 'too big'
    
    if height == 'to big' & width == 'too big' 
        x = photo.Width / maxWidth;
        y = photo.Height / maxHeight;
        if x > y
            scale_by_width(photo)
        else
            scale_by_height(photo)
    
    elseif height == 'too big'
        scale_by_height(photo)
    
    elseif width == 'too big'
        scale_by_width(photo)
    
    else
        do_nothing