• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

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

Holger Dee Assuran

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

Holger Dee Assuran

Я так понимаю это называется "перспектива" - как бы наклонить изображение верхним краем от себя...
Путем рытья пришел к выводу что надо использовать одну из функций:
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

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

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

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

Holger Dee Assuran

В результате, код будет выглядеть так:
Код:
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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!