How can I center captions in PerlMagick?
Using ImageMagick on the command line I can say
convert -background '#0000' -fill white -stroke black -strokewidth 3 -gravity center -pointsize 78 -size 568x1000 caption:'Lorem ipsum etc etc' -trim +repage out.png
And produce the output I'm looking for. What I'd like to do is the same thing but within PerlMagick so that I don't have to keep reading and writing files as I perform various other steps. Here's what I have so far
use strict;
use warnings;
use Image::Magick;
my $im = new Image::Magick;
my $e = $im->Set(
background => '#0000',
fill => 'white',
stroke => 'black',
strokewidth => 3,
gravity => 'center',
pointsize => 78,
size => '586x1000',
);
die $e if $e;
$e = $im->Read("caption:Lorem ipsum etc etc");
die $e if $e;
$e = $im->Trim();
die $e if $e;
$e = $im->Set(page=>'0x0+0+0'); # +repage
die $e if $e;
$e = $im->Write('out.png');
die $e if $e;
And this works precisely the same way, except that the resulting text is not centered.
Documentation on PerlMagick is almost nonexistent. I based this "read caption" syntax on some MagicWand examples, where it is claimed that this will result in centered text. Clearly something is different for PerlMagick.
So, the question: How can I make PerlMagick respect gravity in this case? How do I get multi-line, centered and word-wrapped text via PerlMagick? Note that this requires that I use caption and not annotate or draw. I'd prefer to avoid manual per-line centering, but I would consider it.
Alternatively, if someone has a sample of doing word wrapping and with proportional fonts and Annotate then that would work for me.
EDIT: Please note that the -caption option to polaroid, though it shares implementation with what I'm doing, is not the same as the caption: pseudo-image. I would still accept an answer using polaroid and -caption if the output closely matches what is given by the example convert command above.
EDIT 2: Here's a more minimal example of the problem.
use strict;
use warnings;
use Image::Magick;
my $im = new Image::Magick;
my $e = $im->SetAttribute(
background => '#0000',
pointsize=>12,
size => '100x100',
gravity => 'center',
);
die $e if $e;
$e = $im->ReadImage('caption:The quick brown fox jumps over the lazy dog.');
die $e if $e;
$e = $im->Write('out.png');
die $e if $e;
Expected result: The text is centered.
Actual result: The text is left-justified.
Actual result should be identical to the output of this command:
convert -background '#0000' -size 100x100 -pointsize 12 -gravity center caption:'The quick brown fox jumps over the lazy dog.' out.png
From looking at the perlmagick source I see nothing that should be intercepting a particular SetAttribute call, so I don't see why gravity is being i开发者_高级运维gnored. How can I get gravity to not be ignored for this? Or, how else can I do word wrapped and centered text with this kind of output?
How about using Annotate()?
use strict;
use warnings;
use Image::Magick;
my $im = Image::Magick->new();
$im->Set(size => "1000x568");
$im->ReadImage('xc:black');
$im->Annotate(text => "Lorem ipsum etc etc",
gravity => "Center",
fill => 'white',
stroke => 'black',
strokewidth => 3,
pointsize => 78);
$im->Write('myout.png');
Version: ImageMagick 6.5.7-8
Closer but still does not center horizontally, just vertically. Kinda running out of ideas...
#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;
my $t = Image::Magick->new();
my $b = Image::Magick->new();
$t->SetAttribute(pointsize=>12, size => '100x50', background=>'transparent');
$b->SetAttribute(size => '100x100');
$t->ReadImage('caption:The quick brown fox jumps over the lazy dog.');
$b->ReadImage('xc:transparent');
$b->Composite(image => $t, gravity=>'center', compose=>'over');
$b->Write('out.png');
This works on Ubuntu 10.04 for me. I only see documentation for "caption" working with the "polaroid" effect.
#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;
my $im = new Image::Magick;
$im->Set(size => '586x1000');
my $e = $im->ReadImage('xc:black');
$im->Polaroid(
fill => 'white',
stroke => 'black',
strokewidth => 3,
gravity => 'center',
pointsize => 78,
caption => "Lorem ipsum etc etc"
);
$e = $im->Trim();
die $e if $e;
$e = $im->Set(page=>'0x0+0+0'); # +repage
die $e if $e;
$e = $im->Write('out.png');
die $e if $e;
精彩评论