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