Математика - Получение максимальной пропорции изображения - PullRequest
2 голосов
/ 27 июня 2011

Мне нужен алгоритм, который определит максимальное увеличение масштаба, которое возможно для изображения.

Правила (ограничение размера BitmapData объекта для Flash Player, но это не вопрос Flash):

  1. ширина и длина изображения должны быть меньше 8,191 пикселей
  2. максимальное количество пикселей на изображении не может превышать 16,777,215

поэтому, как указано в документации:

если объект BitmapData имеет размер 8 191 пиксель в ширину, это может быть только 2048 пикселей высокий.

В своем коде я сначала определяю, нарушено ли какое-либо из этих правил, а также выбрасывает и выдает ошибку. это позволяет мне знать, что любое изображение, которое загружается и не выдает ошибку, имеет масштабируемость.

Я использую изображение 2514 width x 1029 height. Это изображение не выдаст ошибку, так как ширина и высота меньше 8191, а количество пикселей или ширина, умноженная на высоту, меньше 16,777,215.

Я считаю, что у меня правильный мозг, и я не очень уверен в своих математических навыках, но вот что я придумал, чтобы определить максимально допустимый масштаб изображения.

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, но я проверил его, и все еще остается много пиксельного пространства, так что его можно увеличить в большем масштабе, и я уверен, что мой код ужасно неправильно.

Есть ли здесь математические волшебники, которые хотят помочь выпускнику художественной школы? Я полностью готов признать, что, возможно, есть гораздо более простое решение этой проблемы, и я готов к плетям.

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

Вы должны умножить ширину и высоту на константу, а масштабированный результат умножения должен быть меньше 16777215.

То есть

a^2 * w * h == 16,777,215

Что дает, дляваши значения w и h

a = 2.5466520486244177 [= Sqrt(16,777,215 / (w*h)) ]

Итак, для ваших значений для новых w и h вы получите:

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

...просто округлите их вниз:)

0 голосов
/ 27 июня 2011

Ну, вот уродливое решение. Я не смог сделать правильное округление, поэтому я перебрал четыре варианта, чтобы получить оптимальное значение. Код должен быть достаточно простым для понимания:

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

Для вашего примера с шириной 2514, высотой 1029; Я получил:

(1831,0, 916,0)

...