2011-01-25 48 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調用。

相關問題