This snippet, takes a jpg image, breaks it into tiles, and displays it on a Tk::Canvas. It is just a "prototype" and highlights the tiles as the mouse moves over them. It could be made clickable. All the data is stored in a hash, no temp files are made.
#!/usr/bin/perl use warnings; use strict; use Imager; use Tk; use Tk::JPEG; use MIME::Base64; my %tiles; my $file = shift || die "need filename\n"; my $tempname = $file; $tempname =~ s/^(.+)(\.\w+)$/$1/; print "$tempname\n"; #set tile size adjustment my $x = 50; #must be same my $y = 50; my $image = Imager->new(); $image->open( file => $file, type => 'jpeg' ) or die $image->errstr(); my $width = $image->getwidth() + 40; my $height = $image->getheight() + 40; print "width->$width height->$height\n"; my $mw = MainWindow->new; $mw->geometry( $width . 'x' . $height . '+100+100' ); my $canvas = $mw->Scrolled( 'Canvas', -bg => 'grey', -width => $width, -height => $height )->pack; my $rows = int( $height / $y + 1 ) - 1; #make it 0 based my $cols = int( $width / $x + 1 ) - 1; print "rows->$rows cols->$cols\n"; foreach my $row ( 0 .. $rows ) { foreach my $col ( 0 .. $cols ) { my $imageout = Imager->new( xsize => $x, ysize => $y, type => 'direct' ); $imageout = $image->crop( left => $col * $y, right => $col * $y + $y, top => $row * $x, bottom => $row * $x + $x ); $imageout->write( type => 'jpeg', data => \$tiles{$row}{$col} +); #or warn $imageout->errstr; $tiles{$row}{$col} = encode_base64( $tiles{$row}{$col} ); my $image = $mw->Photo( -data => $tiles{$row}{$col} ); $tiles{$row}{$col} = $canvas->createImage( $col * $x, $row * $y, -image => $image, -anchor => 'nw', ); $tiles{'r'}{$row}{$col} = $canvas->createRectangle( $col * $x, $row * $y, $col * $x + $x, $row * $y + $y, -width => 0, -outline => 'grey', ); $canvas->bind( $tiles{$row}{$col}, '<Enter>', sub { $canvas->itemconfigure( $tiles{'r'}{$row}{$col}, -outline => "yellow", -width => 5 ); print "Entered $row $col\n"; } ); $canvas->bind( $tiles{$row}{$col}, '<Leave>', sub { $canvas->itemconfigure( $tiles{'r'}{$row}{$col}, -outline => "grey", -state => 'disabled', -width => 0, ); } ); $canvas->update; } } MainLoop;

In reply to Tk Canvas Image Map by zentara

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.