use strict;
use warnings;
use Image::Magick;

# Hintergrund- und Zielbild
my $dest = Image::Magick->new();
# A380 Leitwerk
$dest->Read('tailx.jpg');
# Ausschnitt 100 x 100 Pixel
$dest->Crop('100x100+0+0');
$dest->Set(page=>'0x0+0+0');
$dest->Set(alpha=>'Set');

# Quell-, Composite- oder Overlaybild
my $src = Image::Magick->new();
$src->Set(size=>'80x80');
$src->Read('gradient:black-white');
$src->Set(alpha=>'Set');

# Offset: auf jeder Seite 10 Pixel
my $offset = "+10+10";

# Kreis fuer 5. Bild
my $circle=Image::Magick->new();
$circle->Set(size=>'100x100');
$circle->Read('xc:black'); # schwarzes Bild
$circle->Draw(fill=>'white',
              primitive=>'circle',
              points=>'49.5,49.5 10,49.5');

# Texturbild - Schachbrettmuster
my $texture = Image::Magick->new();
$texture->Read('pattern:checkerboard');

# Bildarray fuer die Ergebnisse
my $results = Image::Magick->new();

# 1. Normale Composites
# ~~~~~~~~~~~~~~~~~~~~~

# $clone dient als Arbeitskopie
my $clone = $dest->Clone();
# beschriften
$clone->Label('Over\n(normal compose)');
# Bilder vereinen
$clone->Composite(image=>$src,
  compose=>'over', geometry=>$offset);
# und abspeichern
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);

# Maskieren und Blending
# ~~~~~~~~~~~~~~~~~~~~~~

$clone=$dest->Clone();
$clone->Label('Circle Masked\n(three images)');
$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
#~~~~~~~~~~~~~

$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);

# Output the changed pixels
# Alles ausgeben. Das Schachbrettmuster markiert die
# transparenten Bildteile
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('composite.jpg');
$montage->Write('win:');

