A while back I engaged in an experiment combining two of my interests - Perl and quilting. I was pleased with the outcome, and decided to continue working on my script to extend its capabilities. This version uses Image::Magick to create an image of the generated random layout.
#!/usr/bin/perl -w
use strict;
use Image::Magick;
###
# Revenge of the Perl Quilt
# - an extension of the original perl quilt generator that
# uses ImageMagick to create a montage image of the generated layout
# Ellen Knowlton Wilson, 3/3/01
###
my @swatch;
my @quilt;
my $number_of_blocks;
my $number_of_columns;
my $number_of_rows;
my %numbers_to_fabrics; # This is a hash containing the
# number and the location of the fabric images. For example,
# my %numbers_to_fabrics = (1 => 'red.jpg', 2 =>
# 'yellow.jpg', 3 => 'blue.jpg')
my $count = scalar keys %numbers_to_fabrics;
# Prompt for the number of columns and rows desired.
do {
print "How many columns would you like? \n";
chomp($number_of_columns = <STDIN>);
print "How many rows would you like? \n";
chomp($number_of_rows = <STDIN>);
$number_of_blocks = $number_of_columns * $number_of_rows
}
# Check that the number of blocks is less than or equal
# to the number of available fabrics. At this time, to
# reuse a fabric requires that it be entered multiple times
# in the hash. I'll probably revise this later.
until ($number_of_blocks <= $count);
@swatch=(1 .. $number_of_blocks);
my $images = Image::Magick->new();
while (@swatch) {
my $x = rand(@swatch);
my $v = $swatch[$x];
# This print statement is useful for finding
# typos in your file names.
print "opening file $numbers_to_fabrics{$v}\n";
$images->Read($numbers_to_fabrics{$v}) && die "read failed";
push(@quilt, $v) && splice(@swatch, $x, 1);
}
# This prints the grid of numbers.
print join(" ", splice(@quilt, 0, $number_of_columns)) ."\n" for
(1..$number_of_rows);
# This creates the montage of images.
my $layout=$images->Montage(geometry=>'50x50+0+0',tile=>$number_of_col
+umns);
$layout->Write("quilt.jpg") && die "write failed";