Измените размеры Изображения для помещений в ограничительную рамку

Помните правила Клуба Оптимизации:

  1. первое правило Клуба Оптимизации, Вы не Оптимизируете.
  2. второе правило Клуба Оптимизации, Вы не Оптимизируете без измерения.
  3. , Если Ваше приложение работает быстрее, чем протокол базовой передачи, оптимизация закончена.
  4. Один фактор за один раз.
  5. Никакие маркетиры, никакие расписания маркетира.
  6. Тестирование продолжится, пока оно имеет к.
  7. , Если это - Ваша первая ночь в Клубе Оптимизации, необходимо записать тестовый сценарий.

Так, принимая Вы на самом деле имеете рабочий код, запускаете Вашу программу под Devel:: NYTProf.

Находят узкие места. Тогда возвратитесь сюда, чтобы сказать нам, каковы они.

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

39
задан Eric Petroelje 9 July 2009 в 20:43
поделиться

5 ответов

Find which is smaller: MaxWidth / w or MaxHeight / h Then multiply w and h by that number

Explanation:

You need to find the scaling factor which makes the image fit.

To find the scaling factor, s, for the width, then s must be such that: s * w = MaxWidth. Therefore, the scaling factor is MaxWidth / w.

Similarly for height.

The one that requires the most scaling (smaller s) is the factor by which you must scale the whole image.

83
ответ дан 27 November 2019 в 02:04
поделиться

I'd similar problem and I've found that very helpful: article. As I understood correctly you need to resize the image?

0
ответ дан 6 July 2019 в 16:56
поделиться

Python code, but maybe it will point you in the right direction:

def fit_within_box(box_width, box_height, width, height):
    """
    Returns a tuple (new_width, new_height) which has the property
    that it fits within box_width and box_height and has (close to)
    the same aspect ratio as the original size
    """
    new_width, new_height = width, height
    aspect_ratio = float(width) / float(height)

    if new_width > box_width:
        new_width = box_width
        new_height = int(new_width / aspect_ratio)

    if new_height > box_height:
        new_height = box_height
        new_width = int(new_height * aspect_ratio)

    return (new_width, new_height)
2
ответ дан 27 November 2019 в 02:04
поделиться

Исходя из предложения Эрика, я бы сделал что-то вроде этого:

private static Size ExpandToBound(Size image, Size boundingBox)
{       
    double widthScale = 0, heightScale = 0;
    if (image.Width != 0)
        widthScale = (double)boundingBox.Width / (double)image.Width;
    if (image.Height != 0)
        heightScale = (double)boundingBox.Height / (double)image.Height;                

    double scale = Math.Min(widthScale, heightScale);

    Size result = new Size((int)(image.Width * scale), 
                        (int)(image.Height * scale));
    return result;
}

Я мог бы немного переборщить с слепками, но я просто пытался сохранить точность расчетов.

]
26
ответ дан 27 November 2019 в 02:04
поделиться

Чтобы выполнить заполнение формата вместо соотношения сторон, используйте большее соотношение сторон. То есть измените код Мэтта с Math.Min на Math.Max.

(заливка аспекта не оставляет пустым ни один ограничивающий прямоугольник, но может вывести часть изображения за границы, в то время как при подгонке аспекта изображение не останется за пределами границ, но может оставить часть ограничивающей рамки пустой.)

6
ответ дан 27 November 2019 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: