Трансформация изображения в трапецию Imagemagick

  • Автор темы Holger Dee Assuran
  • Дата начала
H

Holger Dee Assuran

Гость
#1
Есть картинка, скажем 110 на 154 пиксела.
Необходимо ее трансформировать посредством Image::Magick модуля Perl в трапецию - нижний край должен быть шире чем верхний. При этом отклонение левого края должно быть больше чем отклонение правого.
Подскажите как это сделать - перекопал кучу документалова, но с моим знанием английского :(
 
H

Holger Dee Assuran

Гость
#2
Я так понимаю это называется "перспектива" - как бы наклонить изображение верхним краем от себя...
Путем рытья здесь пришел к выводу что надо использовать одну из функций:
AffineTransform()
Distort()
еще вызвала подозрение на пригодность Shear()
Только я не могу понять какую из них юзать. Код, на примере AffineTransform() должен быть чем-то вроде:
Код:
use Image::Magick;
my $IMG = Image::Magick->new;
$IMG->Read(%filename%);
$IMG->AffineTransform(%parameters%);
$IMG->Write(%outfilename%);
Из этого уточняю свой вопрос:
Какую функцию лучше использовать и какие параметры ей передать?

Ну и может я вообще не то накопал - наставьте на путь истинный.
 
H

Holger Dee Assuran

Гость
#3
Итак, путем долгого рытья по просторам тырнета нарыл таки решение. Почитать как сделать из прямоугольной картинки трапецию можно тут.

Правда данный функционал реализован в версии ImageMagic, кажется, 6.5 и выше.
Ну и еще один момент - с некоторых пор в ImageMagick по умолчанию отсутствует поддержка формата JPEG - ее надо ставить отдельно. Про это читайте здесь.

Тему считаю закрытой.
Спасибо всем, кто помог, то-есть мне ;)
 
H

Holger Dee Assuran

Гость
#4
В результате, код будет выглядеть так:
Код:
use Image::Magick;
my $IMG = Image::Magick->new;
$IMG->Read(%filename%);
$IMG->Distort('virtual-pixel' => "transparent", 'method' => "Perspective", 'points' => [0,0, 60,0, 0,86, 0,86, 110,86, 110,86, 110,0, 80,0]);
$IMG->Write(%outfilename%);
Ну и на вкусненькое, в параметр points передается массив float значений. Четыре пары координат описывающих углы области на картинке и их смещение при трансформации. Таким образом, значения приведенные в примере, при исходной картинке 110х86, означают следующее:
0,0, 60,0, - левый верхний угол изображения сместить на 60 пикселей вправо по оси X
0,86, 0,86 - левый нижний угол оставить на месте
110,86, 110,86 - правый нижний угол оставить на месте
110,0, 80,0 - правый верхний угол сместить на 30 пикселей влево по оси X

Теперь тему можно действительно закрыть, я полностью ответил на свой вопрос.