2011-01-25 82 views
1

我需要创建一个480w×360h像素“画布”内的图像。Perl - Image :: Magick创建特定大小的图像“画布”,同时保持原始图像的纵横比?

我确实从我的远程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 * 360

A “画布” 的大小从URL减少原始图像纠正宽高比为480w或360h,并将其放置在480x360画布的中间。

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

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

看起来像调整大小,同时保持宽高比,同时创建一个固定的输出图像是非常困难的!搜索时间没有帮助我。

我赞扬那位提供详细解决方案的人。谢谢。

回答

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); 
... 
+0

谢谢你,我想今天这个......我将分享我的结果... – DulcimerDude 2011-01-26 12:38:26

0

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

转换-geometry 25%X25%file1.jpg file2.jpg

需要注意的是,你可以做到这一切,而不调用系统()也是如此,尽管系统()可能更容易得到你然后将其转换为内部Image :: Magick API调用。

相关问题