Math 数学-获得最大比例图像比例

Math 数学-获得最大比例图像比例,math,scale,Math,Scale,我需要一个算法,将确定最大规模的增加,这是可能的图像 规则(Flash Player对象的大小限制,但这不是Flash问题): 图像的宽度和长度必须小于8191像素 图像中的最大像素数不能超过16777215 因此,如文件中所述: 如果BitmapData对象为8191像素 宽,它只能是2048像素 高 在我的代码中,我首先确定这些规则中是否有任何规则被破坏,如果它们被破坏,则抛出并出错。这让我知道,任何已加载且未引发错误的映像都具有可伸缩性 我使用的图像是2514宽x1029高。此图像不会引发

我需要一个算法,将确定最大规模的增加,这是可能的图像

规则(Flash Player对象的大小限制,但这不是Flash问题):

  • 图像的宽度和长度必须小于8191像素
  • 图像中的最大像素数不能超过16777215
  • 因此,如文件中所述:

    如果BitmapData对象为8191像素 宽,它只能是2048像素 高

    在我的代码中,我首先确定这些规则中是否有任何规则被破坏,如果它们被破坏,则抛出并出错。这让我知道,任何已加载且未引发错误的映像都具有可伸缩性

    我使用的图像是
    2514宽x1029高
    。此图像不会引发错误,因为宽度和高度均小于8191,并且其像素计数(或宽度乘以高度)小于16777215

    我认为自己是右脑,对自己的数学技能没有多大信心,但下面是我为确定图像允许的最大比例而想到的

    private static const MAX_BITMAP_MEASUREMENT:uint = 8191;
    private static const MAX_BITMAP_PIXELS:uint = 16777215;
    
    var imageWidth:uint = 2514;
    var imageHeight:uint = 1029;
    
    var roughScaleUp:Number = 1.0 / Math.max(imageWidth, imageHeight) * MAX_BITMAP_MEASUREMENT;
    var scaleBack:Number = Math.max(Math.min(imageWidth, imageHeight) * roughScaleUp - MAX_BITMAP_PIXELS / MAX_BITMAP_MEASUREMENT, 0);
    var maxScale:Number = 1.0 / (Math.max(imageWidth, imageHeight) + scaleBack) * MAX_BITMAP_MEASUREMENT;
    
    这段代码输出我的图像的最大比例为2.145144435977516,但是我测试了它,仍然有很多像素空间,所以它应该可以放大更多,我很确定我的代码是错误的


    这里有没有数学奇才愿意帮助一个卑微的艺术学校毕业生?我完全准备好接受这个问题可能有一个更简单的解决方案,我准备好了绑扎。

    你必须将宽度和高度乘以一个常数,乘法的比例结果应该小于16777215

    所以

    对于
    w
    h

    a = 2.5466520486244177 [= Sqrt(16,777,215 / (w*h)) ]
    
    因此,对于新的
    w
    h
    的值,您可以得到:

    NewW = a * w = 6402.283250241786
    NewH = a * h = 2620.5049580345258  
    

    。。。把它们四舍五入:)

    好吧,这里有一个丑陋的解决方案。我不能完全正确地进行舍入,因此我强行通过4种可能性来获得最佳值。代码应足够直观,以便理解:

    from math import *
    
    def opt_image(w, h):
        aspect = w / h
        if aspect >= 1:
            v = min(sqrt(1677215 / aspect), 8191)
            a, b = floor(aspect * v), floor(v)
            area, nw, nh =  max([ ( (a+x)*(b+y), (a+x), (b+y) ) for x in range(2) for y in range(2) if (a+x)*(b+y) < 1677215 ])
            return nw, nh
    
        a, b = opt_image(w, h)
        return b, a
    
    从数学导入*
    def opt_图像(宽、高):
    纵横比=w/h
    如果方面>=1:
    v=最小值(sqrt(1677215/纵横比),8191)
    a、 b=地板(坡向*v),地板(v)
    面积,nw,nh=最大值([(a+x)*(b+y),(a+x),(b+y))对于范围(2)中的x,对于范围(2)中的y,如果(a+x)*(b+y)<1677215])
    返回新罕布什尔州西北部
    a、 b=可选图像(w,h)
    返回b,a
    
    例如,宽度为2514,高度为1029;我得到:

    (1831.0916.0)


    您是如何定义最大位图测量和最大位图像素的?考虑将你的一个内衬进一步分解,并可以在命名变量中存储最大值和最小值。也可以将
    a
    b
    重命名为它们的意思……我已经编辑了代码。希望我的尝试现在更加清晰。
    from math import *
    
    def opt_image(w, h):
        aspect = w / h
        if aspect >= 1:
            v = min(sqrt(1677215 / aspect), 8191)
            a, b = floor(aspect * v), floor(v)
            area, nw, nh =  max([ ( (a+x)*(b+y), (a+x), (b+y) ) for x in range(2) for y in range(2) if (a+x)*(b+y) < 1677215 ])
            return nw, nh
    
        a, b = opt_image(w, h)
        return b, a