blob: c98fac9be9e555dc6e40b1a26f766ce6a1f142ee [file] [log] [blame]
#!/usr/bin/perl
#
# Demonstration of some of the fancier Image Composition Methods
# including the 'rotate' parameter specific to PerlMagick Composite()
#
# NOTE: versions of IM older than IM v6.5.3-4 will need to rename the
# parameter "args=>" to the mis-named "blend=>" parameter.
#
# Also not that "composite -watermark" is actually known as the compose
# method "Modulate".
#
# Essentually each image is equivelent to
# convert logo: -crop 80x80+140+60 +repage \
# -size 60x60 gradient:black-white \
# -alpha set miff:- |\
# composite - -geometry +10+10 -virtual-pixel gray \
# -dissolve 70x30 show:
# for various composition methods.
#
use strict;
use Image::Magick;
# Background or Destination image
my $dest=Image::Magick->new();
$dest->Read('logo:');
$dest->Crop('100x100+400+100'); # wizards hat
$dest->Set(page=>'0x0+0+0');
$dest->Set(alpha=>'Set');
# Source, Composite or Overlay image
my $src=Image::Magick->new();
$src->Set(size=>'80x80');
$src->Read('gradient:black-white');
$src->Set(alpha=>'Set');
my $offset="+10+10";
# Circle Mask Image (same size as Destination)
my $circle=Image::Magick->new();
$circle->Set(size=>'80x80');
$circle->Read('xc:black');
$circle->Draw(fill=>'white',primitive=>'circle',points=>'39.5,39.5 10,39.5');
my $texture=Image::Magick->new();
$texture->Read('pattern:checkerboard');
# List of images generated
my $results=Image::Magick->new();
# Working copy of Destination Image
my $clone;
# ----------------------------------------
# Normal Composition Methods
$clone=$dest->Clone();
$clone->Label('Over\n(normal compose)');
$clone->Composite(
image=>$src,
compose=>'over',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('Multiply\n(add black)');
$clone->Composite(
image=>$src,
compose=>'multiply',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('Screen\n(add white)');
$clone->Composite(
image=>$src,
compose=>'screen',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('HardLight\n(light effects)');
$clone->Composite(
image=>$src,
compose=>'hardlight',
geometry=>$offset,
);
push(@$results, $clone);
# ---------------
# Masked and Blending Demonstartion
$clone=$dest->Clone();
$clone->Label('Circle Masked\n(three image)');
$clone->Composite(
image=>$src,
mask=>$circle,
compose=>'over',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('Blend 50x50\n(50% plus 50%)');
$clone->Composite(
image=>$src,
compose=>'blend',
args=>'50x50',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('Dissolve 50x50\n(50% over 50%)');
$clone->Composite(
image=>$src,
compose=>'dissolve',
args=>'50x50',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('Dissolve 50\n(50% over 100%)');
$clone->Composite(
image=>$src,
compose=>'dissolve',
args=>'50',
geometry=>$offset,
);
push(@$results, $clone);
# ---------------
# Displacement Demonstartion
$clone=$dest->Clone();
$clone->Label('Displace 50x0\n(displace horiz)');
$clone->Set('virtual-pixel'=>'gray');
$clone->Composite(
image=>$src,
compose=>'displace',
args=>'50x0',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('Displace 0x50\n(compress vert)');
$clone->Set('virtual-pixel'=>'gray');
$clone->Composite(
image=>$src,
compose=>'displace',
args=>'0x50',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('Displace 50x50\n(diagonal)');
$clone->Set('virtual-pixel'=>'gray');
$clone->Composite(
image=>$src,
compose=>'displace',
args=>'50x50',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('Displace 0,-80\n(displace flip)');
$clone->Set('virtual-pixel'=>'gray');
$clone->Composite(
image=>$src,
compose=>'displace',
args=>'0,-80',
geometry=>$offset,
);
push(@$results, $clone);
# ---------------
# Demonstrate rotation
# note that offset is automatically adjusted to keep rotated image
# centered relative to its '0' rotation position
$clone=$dest->Clone();
$clone->Label('Rotate 0\n');
$clone->Composite(
image=>$src,
compose=>'over',
rotate=>0,
background=>'none',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('Rotate 10\n');
$clone->Composite(
image=>$src,
compose=>'over',
rotate=>10,
background=>'none',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('Rotate 45\n');
$clone->Composite(
image=>$src,
compose=>'over',
rotate=>45,
background=>'none',
geometry=>$offset,
);
push(@$results, $clone);
$clone=$dest->Clone();
$clone->Label('Rotate 90\n');
$clone->Composite(
image=>$src,
compose=>'over',
rotate=>90,
background=>'none',
geometry=>$offset,
);
push(@$results, $clone);
# ----------------------------------------
# Output the changed pixels
# to every image underlay a checkboard pattern
# so as to show if any transparency is present
for my $image ( @$results ) {
$image->Composite(
image=>$texture,
tile=>'True',
compose=>'DstOver',
);
}
my $montage=$results->Montage(
geometry=>'+10+10',
tile=>'4x',
frame=>'6x6+2+2',
shadow=>'True',
);
$montage->Write('show:');
$montage->Write('compose_specials.jpg');