Math 在允许的像素限制内最大化图像比例?

Math 在允许的像素限制内最大化图像比例?,math,scale,Math,Scale,我试图最大化图像的比例,以便尽可能多地使用允许的像素限制 我使用的语言是ActionScript3.0,但这个问题纯粹与数学有关,不幸的是,我不是抽屉里最敏锐的计算器 从ActionScript 3.0文档中,关于: BitmapData对象的最大宽度或宽度为8191像素 高度,并且像素总数不能超过16777215 像素。(因此,如果BitmapData对象的宽度为8191像素,则它只能 高2048像素。) 首先,我将图像资源加载到程序中,并确定其最大可伸缩性,如下所示: const MAX_B

我试图最大化图像的比例,以便尽可能多地使用允许的像素限制

我使用的语言是ActionScript3.0,但这个问题纯粹与数学有关,不幸的是,我不是抽屉里最敏锐的计算器

从ActionScript 3.0文档中,关于:

BitmapData对象的最大宽度或宽度为8191像素 高度,并且像素总数不能超过16777215 像素。(因此,如果BitmapData对象的宽度为8191像素,则它只能 高2048像素。)

首先,我将图像资源加载到程序中,并确定其最大可伸缩性,如下所示:

const MAX_BITMAP_MEASUREMENT:Number = 8191;
const MAX_BITMAP_PIXELS:Number = 16777215;

var maximumScaleProperty:Number = Math.sqrt(MAX_BITMAP_PIXELS / (image.width * image.height));
这适用于大多数图像,但对于宽得多、高得多的图像(如全景图像),这会产生问题

例如,我有一个图像是
1928宽x 451高
。使用上面的等式来确定它的最大可伸缩性,它将返回
4.392564519715899

var maximumScaleProperty:Number = Math.sqrt(16777215 / (1928 * 451));
//returns 4.392564519715899
但是,如果我现在实际将此图像缩放4.392564519715899,而总像素数在
MAX\u BITMAP\u pixels
(16777215)范围内,则图像宽度将变得太大,无法容纳侧面允许的最大值(8191):

因此,为了尝试解决(阅读train Crank)这个问题,我首先评估图像的最长边乘以初始最大比例是否大于8191(为简单起见,我现在只关注宽度是否更长)。然后我将图像的最长边指定给8191,并将最短边(高度)减少到允许像素中图像宽度溢出的百分比

//  Evaluate to see if it's too big and reajust if it is:
if  (Math.max(imageWidth * maximumScaleProperty, imageHeight * maximumScaleProperty) > MAX_BITMAP_MEASUREMENT)
{
    var percentReduction:Number = 1.0 - MAX_BITMAP_MEASUREMENT / (Math.max(imageWidth, imageHeight) * maximumScaleProperty);
    maximumScaleProperty = Math.sqrt(MAX_BITMAP_PIXELS / (MAX_BITMAP_MEASUREMENT * (image.height - image.height * percentReduction)));
}
虽然这样做有效,但它太过降低了可伸缩性,因此没有使用最大数量的可用像素

在这个特定的例子中,初始可伸缩性是在
4.392564519715899
处计算的,但是由于边太长,可伸缩性一直降低到
2.166942201401723
,但这太多了。基于在我的程序中手动缩放它,接近
3.9或4.0
的东西将在不被切断的情况下使用最大数量


我的方程中的问题在哪里?

因此您希望在以下约束条件下(其中
h
=图像高度,
w
=图像宽度)最大化比例(
s

请注意,我们选择第一个约束的正根,因为
s
必须为正

因此,
s=min(sqrt(16777215/n)、8191/h、8191/w)

例子 以您的
h=1928,w=451
为例,我们有:

s = min( sqrt( 16777215 / n),8191 / h , 8191 / w)
  = min(4.3926,4.2484,18.1619)
  = 4.2484
最大化缩放高度。

使用最后一个示例, 8191 / 8469 ~= 0.9671744007556972 因此,将宽度设置为8191,然后将高度乘以0.9671744007556972 =~1916年

1916 * 8191 ~= 15,693,956
这接近极限,我认为你可以在不损失纵横比的情况下得到


如果你不关心长宽比(也就是说,你想在一个轴上拉伸),那么你已经有了8191的宽度,所以将高度设置为2048,这将导致精确的限制。

我希望我有更多的数学头脑。谢谢你更优雅的解决方案,雅各布。@1978年的黑暗:谢谢,没问题:)!
s <= sqrt(16777215/n)
s <= 8191 / h
s <= 8191 / w
s = min( sqrt( 16777215 / n),8191 / h , 8191 / w)
  = min(4.3926,4.2484,18.1619)
  = 4.2484
1916 * 8191 ~= 15,693,956