2

Perl と ImageMagick (Perl-API) を使用しています。最初のステップでは、画像の長方形を取り、画像のこの部分をぼかします(さらにその長方形の回転)。Mark Setchell のおかげで、これはさらに次のように機能します (ここでスタックオーバーフローの質問を参照してください: ImageMagick を使用して画像の一部をぼかし/ピクセル化する方法? )。

今私の目的は、その画像の長方形をより大きなピクセルの結果でぼかすことです。どうすればそれを達成できますか?

これまでに使用したMark Setchellのコードは次のとおりです。

#!/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 つの問題が残っています:

回転せずに選択した長方形でうまく機能します。しかし、角度を適用すると、奇妙な結果が得られます。ピクセル化される領域は、私が定義した領域ではありませんが、画像の中央から離れた長方形を選択したり、角度を大きくしたりするほど異なります。

下の画像では、さまざまな長方形が選択され、ピクセル化された領域が示されています。私は45度の角度を使用しました。

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

ここで何が問題なのか分かりますか?(たぶん「CopyOpacity 重心を構成する」)

4

2 に答える 2

4

このようなもの?

#!/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 scale
$blurred = $image->Clone();
$blurred->Resample(x=>'100',y=>'50',filter=>'point');
$blurred->Scale(width=>'1200',height=>'600');
$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=>'20,20,220,120');
$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');

ここに画像の説明を入力

于 2015-09-02T11:06:34.110 に答える
1

Mark Setchells の回答は受け入れたままにしますが、更新された質問への解決策をここに投稿してください。私はヘルパー関数を使用し、「マスクを作成して回転させる」部分のみを変更しました。

# helperfunction
sub listDraw
{
    my $image = shift;
    my $result = undef;

    for my $attrs (@_)
    {
        my ($left, $top, $width, $height, $angle) = delete @$attrs{qw(left top width height angle)};

        if ($angle - int($angle/180)*180)
        {
            my ($xm, $ym, $rad) = ($left + $width/2, $top + $height/2, $angle * PI/180);
            $attrs->{primitive} ||= 'Polygon';
            $attrs->{points} = join ' ', map {($xm + ($_->{x}-$xm)*cos($rad) + ($_->{y}-$ym)*sin($rad)) . ',' . ($ym - ($_->{x}-$xm)*sin($rad) + ($_->{y}-$ym)*cos($rad))}
                ({ x => $left, y => $top }, { x => $left + $width, y => $top }, { x => $left + $width, y => $top + $height }, { x => $left, y => $top + $height });
        }
        else
        {
            $attrs->{primitive} ||= 'Rectangle';
            $attrs->{points} ||= $left . ',' . $top . ' ' . ($left + $width - 1) . ',' . ($top + $height - 1);
        }
        last if $result = $image->Draw(%$attrs);
    }
    return $result;
}

    # Make mask and rotate
    $mask=Image::Magick->new(size=>'600x300');
    $mask->Read('xc:white');

    $mask = listDraw($mask, {
            left        => $selection_y, # y of top left corner
            top         => $selection_x, # x of top left corner
            width       => $selection_width,
            height      => $selection_height,
            angle       => 180 - $angle,
            fill        => 'black',
    });
    $mask->Set('virtual-pixel' => 'white');
    $mask->Transparent('white');
于 2015-09-09T11:11:40.583 に答える