Perl - Image :: Magick在保持原始图像宽高比的同时创建特定尺寸的图像“画布”?

时间:2011-01-25 20:25:45

标签: perl resize imagemagick

我需要创建480w x 360h像素“画布”内的图像。

我确实从我的远程网址创建了一些图片,在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。

将原始图像从网址缩小至480w或360h的正确宽高比,并将其放置在480x360画布的中间。

我读到的地方,没有提供任何示例,我可以调整原始图像的大小,同时保持纵横比正确的高度或宽度,无论哪个允许图像最大,然后将另一个参数(h或w)除以2,然后制作根据它添加边框,然后裁剪到大小。混淆了“他+双曲棍球棒”。

我很想弄明白这一点。我甚至不确定我的问题是否清楚,值得问一下stackoverflow。

似乎在保持宽高比的同时调整大小,同时创建固定的输出图像非常困难!几个小时的搜索没有帮助我。

我称赞提供详细解决方案的人。感谢。

2 个答案:

答案 0 :(得分:3)

使用Image::Magick模块,然后使用外部convert命令是不是有点傻?您可以使用Image::Magick在Perl脚本中完成所有这些操作。

无论如何,如果您阅读fine manual,您会发现ImageMagick会调整到480x360以内的最高尺寸,而不会使用480x360更改宽高比。这适用于convertImage::Magick内的命令行。当您添加!时,您告诉它将调整为精确到480x360,而忽略宽高比。

这可以让你在不使用外部命令的情况下开始使用:

...
$p->Resize(geometry=>'480x360');
$p = $p->Montage(geometry=>'480x360', background=>'black', fill=>'white',
                 stroke=>'white', pointsize=>12, title=>$somewords);
$p->Write($new);
...

答案 1 :(得分:0)

获得相同宽高比的最简单方法是计算和缩放百分比。 ImageMagick允许您使用几何的百分比进行缩放。 IE,

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

请注意,您可以在不调用system()的情况下完成所有这些操作,尽管system()可能更容易启动,然后将其转换为内部的Image :: Magick API调用。