Perl - Image :: Magick создать определенный размер изображения «холст», сохраняя при этом пропорции исходного изображения? - PullRequest
1 голос
/ 25 января 2011

Мне нужно создать изображения с разрешением "холст" с разрешением 480 x 360 пикселей.

Я создал несколько изображений из удаленного URL-адреса, без проблем с помощью stackoverflow.

ОднакоЯ хочу сохранить соотношение сторон изображения, но конечный результат должен быть 480x360. Поэтому необходимо использовать метод «канва» или границы, а затем использовать метод кадрирования (из того, что я прочитал), но, похоже, я не могу его получитьсобирается.

Вот что у меня есть:

#!/usr/bin/perl
use Image::Resize;
use Image::Magick;
use strict;

my $new = 'path/to/image/image.jpg';
my $somewords = 'Some words';
my $imageurl='http://myimageurl.com/image.jpg';

my $p = new Image::Magick;
$p->Read("$imageurl");

 my ($origw, $origh) = $p->Get('width', 'height');
#### correct size images get processed here with just annotation ########
  if (($origw == 480) && ($origh == 360)){
  system("convert $imageurl  -fill '#FFFFFF' -font Candice -pointsize 12 -undercolor '#00000080' -gravity SouthEast -annotate +1+1 '$somewords' $new");
  }
#### process images of incorrect original size WHERE I AM STUCK #######
  if (($origw != 480) && ($origh != 360)){
system("convert $imageurl $new");
   system("convert $imageurl -resize 480x360\! -fill '#FFFFFF' -font Candice -pointsize 14 -undercolor '#00000080' -gravity SouthWest -annotate +1+1 '$somewords' $new");
  }

Мне нужно вот что:

Размер "холста" 480 x 360.

Уменьшите исходное изображение с URL-адреса до правильного соотношения сторон на 480w или 360h и поместите его в середину холста 480x360.

Я где-то читал, что не было примеров, чтобы я мог изменить размер исходного изображения, покаподдержание соотношения сторон для правильной высоты или ширины, в зависимости от того, какое изображение будет наибольшим, затем разделите другой параметр (h или w) на 2, а затем добавьте границу на основе этого, затем обрежьте до размера.Смутил «он + двойные клюшки» из меня.

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

Похоже, изменение размера при сохранении соотношения сторон при создании фиксированного выходного изображения очень сложно!Часы поиска мне не помогли.

Я восхваляю того, кто предлагает подробное решение.Спасибо.

Ответы [ 2 ]

3 голосов
/ 26 января 2011

Не глупо ли использовать модуль Image::Magick, а затем использовать внешнюю команду convert? Вы можете сделать все это в вашем Perl-скрипте, используя Image::Magick.

В любом случае, если вы прочитаете подробное руководство , вы обнаружите, что ImageMagick изменит размеры до максимальных в пределах 480x360 без изменения соотношения сторон с помощью 480x360. Это работает как в командной строке с convert, так и внутри Image::Magick. Когда вы добавляете !, вы говорите, чтобы он изменил размер до 480x360 без учета соотношения сторон.

Это должно помочь вам начать работу без использования внешних команд:

...
$p->Resize(geometry=>'480x360');
$p = $p->Montage(geometry=>'480x360', background=>'black', fill=>'white',
                 stroke=>'white', pointsize=>12, title=>$somewords);
$p->Write($new);
...
0 голосов
/ 26 января 2011

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

convert -geometry 25% x25% file1.jpg file2.jpg

Обратите внимание, что вы можете делать все это без вызова system (), хотя system(), вероятно, проще начать, а затем преобразовать его во внутренние вызовы API Image :: Magick.

...