如何使用 ImageMagick blur/pixelate 图像的一部分?
How to blur/pixelate part of an image using ImageMagick?
我正在使用 Perl 和 ImageMagick (Perl-API)。
在第一步中,我想拍摄一个图像的矩形并模糊图像的这一部分。期望的结果是矩形模糊的原始图像。
在第二步中,我需要使用旋转的矩形(即旋转 35%)模糊图像的一部分。
我该如何实现?
我能想到的最好的方法是利用遮罩来模糊。这将允许您 "draw" 一个形状,并通过要模糊的部分。
示例:
# Create base image
convert rose: -sample 200x rose_large.png
# Create mask
convert -size 200x131 xc:black -fill white -draw 'circle 100 65 100 25' rose_mask.png
# Blur with mask
convert rose_large.png -mask rose_mask.png -blur 0x8 +mask rose_blur_mask.png
其他技术和示例here。我不熟悉 Perl API,但应该有一个接受图像处理程序参数的 Mask
方法。
更新
对于矩形,您只需更新形状以在蒙版上绘制。这是一个示例,其中我只对矩形内部的内容进行模糊处理。
# Create rectangle mask
convert -size 200x131 xc:white -fill black -draw 'rectangle 50 30 150 100' rose_rectangle_mask.png
# And repeat blur apply
convert rose_large.png -mask rose_rectangle_mask.png -blur 0x8 +mask rose_blur_retangle_mask.png
正如您要求的 PerlMagick,我竭尽全力尝试在 Perl 中执行此操作...文件 1.png
、2.png
和 3.png
纯粹是用于调试,以便您可以看到我在做什么。
#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;
my $x;
my $image;
my $blurred;
my $mask;
# Create original fishscale image
$image=Image::Magick->new(size=>'600x300');
$image->Read('pattern:fishscales');
$image->Write(filename=>"1.png");
# Copy original image and blur
$blurred = $image->Clone();
$blurred->GaussianBlur('x2');
$blurred->Write(filename=>"2.png");
# Make mask and rotate
$mask=Image::Magick->new(size=>'600x300');
$mask->Read('xc:white');
$mask->Draw(fill=>'black',primitive=>'rectangle',points=>'100,100,200,200');
$mask->Set('virtual-pixel'=>'white');
$mask->Rotate(20);
$mask->Transparent('white');
$mask->Write(filename=>"3.png");
# Copy mask as alpha channel into blurred image
$blurred->Composite(image=>$mask,qw(compose CopyOpacity gravity center));
# Composite blurred image onto original
$image->Composite(image=>$blurred);
$image->Write(filename=>'result.png');
这是调试图像...
1.png
2.png
3.png
result.png
可能有一种更快、更简单、更有效的方法来做到这一点,但我不知道,而且 PerlMagick 的例子很少,所以我会把我的标记留在沙子里看看有没有人能做得更好:-)
P.S。不要为我的头发难过 - 反正只剩下三个了:-)
我正在使用 Perl 和 ImageMagick (Perl-API)。 在第一步中,我想拍摄一个图像的矩形并模糊图像的这一部分。期望的结果是矩形模糊的原始图像。
在第二步中,我需要使用旋转的矩形(即旋转 35%)模糊图像的一部分。
我该如何实现?
我能想到的最好的方法是利用遮罩来模糊。这将允许您 "draw" 一个形状,并通过要模糊的部分。
示例:
# Create base image
convert rose: -sample 200x rose_large.png
# Create mask
convert -size 200x131 xc:black -fill white -draw 'circle 100 65 100 25' rose_mask.png
# Blur with mask
convert rose_large.png -mask rose_mask.png -blur 0x8 +mask rose_blur_mask.png
其他技术和示例here。我不熟悉 Perl API,但应该有一个接受图像处理程序参数的 Mask
方法。
更新
对于矩形,您只需更新形状以在蒙版上绘制。这是一个示例,其中我只对矩形内部的内容进行模糊处理。
# Create rectangle mask
convert -size 200x131 xc:white -fill black -draw 'rectangle 50 30 150 100' rose_rectangle_mask.png
# And repeat blur apply
convert rose_large.png -mask rose_rectangle_mask.png -blur 0x8 +mask rose_blur_retangle_mask.png
正如您要求的 PerlMagick,我竭尽全力尝试在 Perl 中执行此操作...文件 1.png
、2.png
和 3.png
纯粹是用于调试,以便您可以看到我在做什么。
#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;
my $x;
my $image;
my $blurred;
my $mask;
# Create original fishscale image
$image=Image::Magick->new(size=>'600x300');
$image->Read('pattern:fishscales');
$image->Write(filename=>"1.png");
# Copy original image and blur
$blurred = $image->Clone();
$blurred->GaussianBlur('x2');
$blurred->Write(filename=>"2.png");
# Make mask and rotate
$mask=Image::Magick->new(size=>'600x300');
$mask->Read('xc:white');
$mask->Draw(fill=>'black',primitive=>'rectangle',points=>'100,100,200,200');
$mask->Set('virtual-pixel'=>'white');
$mask->Rotate(20);
$mask->Transparent('white');
$mask->Write(filename=>"3.png");
# Copy mask as alpha channel into blurred image
$blurred->Composite(image=>$mask,qw(compose CopyOpacity gravity center));
# Composite blurred image onto original
$image->Composite(image=>$blurred);
$image->Write(filename=>'result.png');
这是调试图像...
1.png
2.png
3.png
result.png
可能有一种更快、更简单、更有效的方法来做到这一点,但我不知道,而且 PerlMagick 的例子很少,所以我会把我的标记留在沙子里看看有没有人能做得更好:-)
P.S。不要为我的头发难过 - 反正只剩下三个了:-)