Как размыть / пикселировать часть изображения с помощью ImageMagick?

Я использую Perl и ImageMagick (Perl-API). На первом этапе я хотел бы взять прямоугольник изображения и размыть эту часть изображения. Желаемый результат - исходное изображение с размытым прямоугольником.

На втором этапе мне нужно размыть часть изображения с перевернутым прямоугольником (то есть, перевернутым на 35%).

Как я могу достичь этого?

2 ответа

Решение

Когда вы просили 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 там, так что я положу свой маркер в песок и посмотрю, сможет ли кто-нибудь лучше это:-)

PS Не расстраивайся из-за моих волос - в любом случае их осталось только три:-)

Лучший способ, которым я могу придумать, - использовать маски, чтобы размыть их. Это позволит вам "нарисовать" фигуру и пройти через то, что будет размыто.

Пример:

 # 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

Другие приемы и примеры здесь. Я не знаком с 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

Другие вопросы по тегам