代码之家  ›  专栏  ›  技术社区  ›  Thariama

如何使用ImageMagick模糊/像素化图像的一部分?

  •  1
  • Thariama  · 技术社区  · 11 年前

    我正在使用Perl和ImageMagick(Perl API)。 在第一步中,我想拍摄一个图像的矩形,并模糊图像的这一部分。期望的结果是矩形模糊的原始图像。

    在第二步中,我需要用旋转的矩形模糊图像的一部分(即旋转35%)。

    我怎样才能做到这一点?

    2 回复  |  直到 11 年前
        1
  •  4
  •   emcconville    11 年前

    我能想到的最好方法是利用面具来模糊。这将允许您“绘制”形状,并通过要模糊的内容。

    例子:

     # Create base image
     convert rose: -sample 200x rose_large.png
    

    rose_large.png

     # Create mask
     convert -size 200x131 xc:black -fill white -draw 'circle 100 65 100 25' rose_mask.png
    

    rose_mask.png

     # Blur with mask
     convert rose_large.png -mask rose_mask.png -blur 0x8 +mask rose_blur_mask.png
    

    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
    

    rose_rectangle_mask

    # And repeat blur apply
    convert rose_large.png -mask rose_rectangle_mask.png -blur 0x8 +mask rose_blur_retangle_mask.png
    

    rose_blur_retangle_mask.png

        2
  •  3
  •   Mark Setchell    11 年前

    当您要求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格式

    enter image description here

    2磅/平方英寸

    enter image description here

    3磅/平方英寸

    enter image description here

    结果.png

    enter image description here

    也许有一种更快、更简单、更有效的方法可以做到这一点,但我不知道,而且PerlMagick的例子很少,所以我会把我的标记放在沙子里,看看是否有人能做得更好:-)

    P.S.别为我的头发感到难过——反正只剩下三根了:-)

    推荐文章