SubjectThe GraphicImage
class is part of the core Whitebeam Presentation Engine - running as part of the Whitebeam Apache module. An instance
of this class represents a graphical image and then methods on that object manipulate that image. This document covers the following aspects of using the GraphicImage class : - How to create images
- Dealing with colours
- Drawing methods
- Pens and styles
- Drawing text
- Other functions
- Summary
The GraphicImage class is an optional compile-time component of Whitebeam and to make use of this
functionality Whitebeam must have been compiled with --enable-gd. The underlying graphics
capabilities are provided by the
Open Source 'libgd' library, which must be installed on your system. Creating ImagesAll images are represented by an instance of the GraphicImage class so the first step in any image manipulation is to
create an instance of that class : var myimage = new GraphicImage The object thus created doesn't yet contain an image. You have two ways of getting an image into the
object: Load an existing image or create an empty canvas onto which to draw. New imagesmyimage.create(width,height[,palette]) The create method creates an empty image of the specified size. Two basic image types are supported : - true-colour
This is the default and, as the name implies, allows you to use the full range of 24bit colour (red-green-blue). - palette
Palette images have at most 256 colours. For a new image none of the colours are allocated. You add new colours to
the palette as required using the
colourAlloc
and
colourResolve
methods
Generally it's recommended that you stick with true-colour images. Loading imagesImages can be loaded in one of two ways - either directly from the servers file system, or alternatively from a
Binary object. Both mechanisms use the
make method.
var img = new GraphicImage;
if (img.make('/images/myimage.gif','images/gif')) {
// Process image here
}
Note : as with most Whitebeam operations that deal with the file system, the root of the
pathname is the 'documentRoot' of the virtual server running your application. You can not access
files outside of your virtual server. Initialising an image from a
Binary object
is often the result of a user uploading a file on a form. The following example illustrates this :
// Data posted by the application
var params = rb.page.formdata();
if (param.uploadImage instanceof Binary) {
var img = new GraphicImage;
if (img.make(params.uploadImage)) {
// Make a thumbnail - 100x100 pixels
var thumb = new GraphicImage;
thumb.create(100,100);
img.copyRect(thumb, null, {x:0,y:0,w:100,h:100});
// Thumb nail can now be saved in the file template or the file system.
}
}
ColoursAll methods that deal with colours treat those colours as numbers. How those numbers
are generated depends on whether the image in question is true-colour (the default) or
colour based image. Representing coloursThe GraphicImage class represents 'colours' using four values. The standard red, green and
blue components and an 'alpha' component. The alpha component tells the system how transparent
the colour is, and therefore how much of the underlying colour will shine through. Red, green and blue components have a range of zero (0) through to 255. The alpha value
has a range of 0 (opaque) through 127 (fully transparent). Palette based coloursThese image have a limit of 256 distinct colours (the palette). Before you use a colour you have to find a
vacant location in the palette. There are two calls to enable you to do this :
colourAlloc and
colourResolve.
The first of these, colourAlloc, looks for the first unused palette entry and assigns to that entry the requested colour,
returning the index to be used in drawing functions. Note that this method does not check whether the
requested colour is already set in another slot in the palette! If the palette is full (256 colours all assigned)
this method returns -1. The second option, colourResolve, is more intelligent and arguably the most sensible. Given a requested colour
the following steps are taken : - A search is made of existing colours. If there is an exact match with
the requested colour then that is returned to the application
- If there is no exact match, but the palette is not full then a new
palette slot is allocated for the requested colour and that is returned
to the application
- If there is no exact match and the palette is full then the set of
existing colours is compared against the requested colour and the best
match is returned to the application
True Colour imagesBoth
colourAlloc and
colourResolve
can be used to generate a colour for true-colour images. Because of the 24 bit colour range though there is no
colour mapping involved. Any colour requested will be allocated. For this reason both routines behave in
exactly the same way. Drawing methodsThe GraphicImage class provides routines for drawing points, lines, rectangles and arcs as follows : See the descriptions of each individual method for details. Pen StylesA number of the drawing methods use the concept of a 'pen' to render their image. The default pen is a single pixel wide
and uses the colour specified in the drawing method call. Two additional methods allow the default pen to be changed
in thickness and in how they are rendered, allowing for example dashed lines. setPenThickness
allows the pen thickness to be adjusted. There is a single numeric parameter. Once set the requested thickness remains until set or reset
be a subsequent call. setPenStyle
is more complicated but allows aribtrarily complex 'dashed' lines to be drawn. Details for how to do this with an example
are in the documentation for the setPenStyle method. Unlike the pen thickness, which applies to all drawing methods, the 'style' must be specifically requested in the drawing
call. This is achieved by setting the colour to the special value of
GraphicImage.styled. Drawing textA single method allows text to be placed into an image :
drawText.
This method allows you to use any suitable font-file, for example true-type fonts. Fonts are refered to by the file name
of the file that contains the font.
For security reasons you are not permitted to specify any file in the system as the font. You have two options :
- Specify a path to the font
If you specify a path (the font parameter contains at least one '/') then the
parameter identifies a specific font file within your virtual servers document root. - Specify just the font file name - no path
If you do not specify a path then the Whitebeam will look in configured 'system'
font areas. These may be well know directories (known and compiled into the
graphics library) or specified by the 'GDFONTPATH' environment variable
The method description covers other aspects of how to draw text into your image. Other methods...The GraphicImage class provides a number of additional methods to manipulate
images. These are documented separately and simple listed here : - clean :
delete data stored in this image. Useful if you're manipulating very large images
- write :
for sending an image directly to the clients browser
- copyRect :
copying and resizing areas of one image into another image
- copyRectRotate :
rotate an area of one image into another image
- setClipRegion :
Restrict drawing operations to a specific subset of the drawing 'canvas'
- sharpen :
apply a sharpenning algorithm to an image
SummaryThe GraphicImage library is intended to provide a simple, straightforward means of manipulating
images within the Whitebeam Presentation Engine. At the moment most basic operations are supported,
we expect the library to be extended over time to incorporate more sophisticated tools. As usual, comments from users are much appreciated! |