开发者

Perl - Image::Magick create specific size image "canvas" while maintaining aspect ratio of original image?

I need to create images that are within a 480w x 360h pixel "canvas".

I did create some images from my remote url, no problem with help from stackoverflow.

However, I desire to maintain aspect ratio of the image but, have the end result be 480x360.. Therefore, a "canvas" or border then crop technique needs to be used (from what I have read) but, I cannot seem to get it going.

Here is what I have:

#!/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' -gravi开发者_运维问答ty SouthWest -annotate +1+1 '$somewords' $new");
  }

What I need is this:

A "canvas" size of 480 x 360.

Reduce the original image from the url to correct aspect ratio at either 480w or 360h and place it in the middle of the 480x360 canvas.

I read somewhere, that offered no examples, that I could resize original image while maintaining aspect ratio to correct height or width whichever allows the image to be largest then, divide the other param (h or w) by 2 and then make add border based on that, then crop to size. Confused the "he + double hockey sticks" out of me.

I am so lost on trying to figure this out. I am even unsure if my question here is clear and worthy of asking stackoverflow.

Seems like resizing while maintaining aspect ratio while creating a fixed output image is very difficult! Hours of searching have not helped me.

I praise the one who offers a verbose solution. Thanks.


Isn't it a bit silly to use the Image::Magick module, and then use the external convert command? You can do all of this within your Perl script using Image::Magick.

Anyway, if you read the fine manual, you'll find that ImageMagick will resize to the highest dimensions within 480x360 without changing the aspect ratio by using 480x360. This works both on the command-line with convert and within Image::Magick. When you add the !, you're telling it to resize to exactly 480x360, disregarding the aspect ratio.

This should get you started without using external commands:

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


The easiest way to get the same aspect ratio would be to calculate and scale by a percentage instead. ImageMagick lets you scale using a percentage for the geometry. IE,

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

Note that you can do all of this without calling system() too, though system() is probably easier to get you started and then convert it to internal Image::Magick API calls later.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜