<?xml version="1.0" encoding="windows-1252"?>
<node id="62069" title="Revenge of the Perl Quilt" created="2001-03-04 00:50:49" updated="2005-08-12 09:44:48">
<type id="1042">
CUFP</type>
<author id="39362">
ailie</author>
<data>
<field name="doctext">
&lt;p&gt;A while back I engaged in [a perl quilt|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. 
&lt;code&gt;
#!/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 =&gt; 'red.jpg', 2 =&gt; 
# 'yellow.jpg', 3 =&gt; '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 = &lt;STDIN&gt;);
   print "How many rows would you like? \n";
      chomp($number_of_rows = &lt;STDIN&gt;);
   $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 &lt;= $count);

@swatch=(1 .. $number_of_blocks);
my $images = Image::Magick-&gt;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-&gt;Read($numbers_to_fabrics{$v}) &amp;&amp; die "read failed";
   push(@quilt, $v) &amp;&amp; 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-&gt;Montage(geometry=&gt;'50x50+0+0',tile=&gt;$number_of_columns);
$layout-&gt;Write("quilt.jpg") &amp;&amp; die "write failed";

&lt;/code&gt;

</field>
</data>
</node>
