Image::Magick нарисовать размытый круг
Есть фоновое изображение. (для этого примера mesh.png
)
К изображению нужно добавить один круг, с размытой каймой. В настоящее время есть это:
use 5.014;
use warnings;
use Image::Magick;
my $bgimg = Image::Magick->new();
$bgimg->Read('png:mesh.png');
draw_my_circle($bgimg, 150, 150, 100); #img, center_x, center_y, radius
$bgimg->Write("win:"); #display
sub draw_my_circle {
my($img, $center_x, $center_y, $radius) = @_;
$img->Draw(
fill => 'black',
points => "$center_x,$center_y @{[$center_x + $radius]},$center_y",
primitive => 'circle',
);
}
Это производит следующее изображение:
но мне нужен круг с "размытым краем", как у следующего (создан вручную)
Может кто-нибудь помочь, как получить такой размытый круг с помощью Image:: Magick?
Если кто-то хочет mesh.png
, он создается с помощью следующего скрипта:
use 5.014;
use warnings;
use Image::Magick;
my $image=Image::Magick->new(size=>'300x300');
$image->Read('xc:white');
for( my $i=0; $i < 300; $i += 10 ) {
$image->Draw(primitive=>'line',points=>"$i,0 $i,300",stroke=>"#ccf");
$image->Draw(primitive=>'line',points=>"0,$i 300,$i",stroke=>"#ccf");
}
$image->Write('png:mesh.png');
1 ответ
Решение
Вы можете использовать Gaussian Blur, как это:
#!/usr/bin/perl
use 5.014;
use strict;
use warnings;
use Image::Magick;
my $x;
my $circle;
my $mesh;
$mesh=Image::Magick->new(size=>'300x300');
$mesh->Read('xc:white');
for( my $i=0; $i < 300; $i += 10 ) {
$mesh->Draw(primitive=>'line',points=>"$i,0 $i,300",stroke=>"#ccf");
$mesh->Draw(primitive=>'line',points=>"0,$i 300,$i",stroke=>"#ccf");
}
$mesh->Write(filename=>'mesh.png');
$circle=Image::Magick->new(size=>'300x300');
$circle->ReadImage('xc:transparent');
$circle->Draw(
fill => 'black',
points => "150,150 @{[250]},100",
primitive => 'circle',
);
$circle->GaussianBlur('10x50');
$circle->Write(filename=>'circle.png');
$mesh->Composite(image => $circle, qw(compose SrcAtop gravity Center));
$mesh->Write(filename=>'out.png');