megaimage tutorial

George Peter Staplin Oct 5, 2007 - Here is a simple tutorial for those of you using megaimage and related extensions from megapkg.

Common setup code

 set dir [file dirname [info script]]
 set ext [info sharedlibextension]
 load [file join $dir megaimage$ext]
 load [file join $dir megaimagetk$ext]
 load [file join $dir jpegext2$ext] Jpegext2 ;#caveat
 load [file join $dir pngext2$ext] Pngext2

Decoding a JPEG, adding a blue rectangle, and then encoding a JPEG

 set fd [open "some.jpg" r]
 fconfigure $fd -translation binary
 set buf [jpegext2:decode [read $fd]]
 close $fd

 set obj [megaimage $buf]
 set x 20
 set y 30
 set width 200
 set height 200
 set color [list 0 0 255 255]
 $obj rectangle $x $y $width $height $color

 set fd [open "output.jpg" w]
 fconfigure $fd -translation binary
 puts -nonewline $fd [jpegext2:encode [$obj getdata]]
 close $fd

jpegext2:encode takes an optional argument after the megaimage data for the quality. Quality should be an integer in the range of 1-100.


Blending Objects Over a Base

 set obj [megaimage-blank 800 600]
 $obj setall [list 127 127 127 255]
 set overlay [megaimage-blank 200 200]
 $overlay setall [list 100 100 200 200]; #RGBA

 set x 0
 set y 0
 $obj blendobj $x $y $overlay
 set x 180
 set y 180
 $obj blendobj $x $y $overlay

pngext2:decode and pngext2:encode are similar to jpegext2, but have some important differences:

% pngext2:decode wrong # args: should be "pngext2:decode file|data filename|data"

% pngext2:encode wrong # args: should be "pngext2:encode data ?-alpha boolean?"

-alpha 1 is the default. -alpha is mostly of interest if you want to make the image a little smaller by eliminating the alpha channel.

Note: if pngext2:decode file $filename is causing segfaults it's probably due to a problem with Tcl_StatBuf size differing. In your build.conf you'll probably want to add the necessary -D to make tcl.h use the right struct stat when building pngext2. For example with unix-like systems: -D_LARGEFILE64_SOURCE=1 -DTCL_WIDE_INT_TYPE=long\\\ long


Using Megaimagetk

 # Making a megaimage object from a photo image.
 set obj [megaimage [megaimage.from.photo $photo_handle]]

 # Make a photo instance have the same data as a megaimage object.
 set p [image create photo]
 megaimage.to.photo [$obj getdata] $p

megaimagetk has more features, but those can get you started.


Cleaning up Megaimage Objects

 set obj [megaimage-blank 800 600]
 rename $obj {}

 set obj [megaimage $someBufferSource]
 rename $obj {}

Q. What is the data returned by jpegext2:decode?

A. It's a ByteArray result with a header at the start, followed by RGBA data.

Q. What is the data returned by jpegext2:encode?

A. It's a ByteArray result with the JPEG header and data, that can be written to the disk and opened in other programs that understand the JPEG format.


See also Simple Animation with Megaimage.