Алгоритм обрезки изображения 4: 3 - PullRequest
2 голосов
/ 24 февраля 2012

Я использую ImageMagick для Perl

use Image::Magick;

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

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

Проблема, с которой я борюсь, это обрезка перед изменением размера.Фотографии должны иметь соотношение сторон 4: 3.Некоторые фотографии имеют новый формат 16: 9 или могут быть обрезаны перед отправкой на сервер, что приводит к перекосу на экране.Перед изменением размера я хотел бы обрезать изображение так, чтобы оно было ближе всего к 4: 3.Например, 800/600 в порядке, но 802/600 обрезала бы центр до 800/600.

Я буду изменять размеры всех фотографий, независимо от размера обрезки, до максимального сохраненного изображения 800/600, но это не имеет значения.Поскольку я могу читать измерения высоты и ширины заранее, возможно, существует алгоритм для вычисления наиболее близкого соответствия.Мне действительно нужна помощь в получении новых размеров для обрезки, а не в ImageMagick, если только в ImageMagick нет функции, которая может сделать это для меня.

Однако мне не удалось найти тот, который делает.

1 Ответ

7 голосов
/ 24 февраля 2012

работал для меня:

my $image_width  = 800; # play with this when testing
my $image_height = 600;

my $target_aspect  = 4 / 3; 
my $current_aspect = $image_width / $image_height;

given ($current_aspect <=> $target_aspect) {
  when (1) { $image_width = int($image_height * $target_aspect); }
  when (-1)  { $image_height = int($image_width / $target_aspect); }
}
...