ImageCFC, by Rick Root (rick@webworksllc.com)
http://www.opensourcecf.com/imagecfc/

2.20 - August 14, 2009
- changed throw() to imagecfcthrow()

2.19 - August 18, 2007
- completely rewrote the writeImage() method
- prevent use of filters in CF 6.1 due to lack of javacast null
- added feather.png to test suite (test-cases.cfm)
- made test-cases.cfm easier to use
- corrected bug in resize() method where resize wouldn't work on indexed color PNGs.
- NOTE:  posterization filter does not work on some image types.
- You may now specify a temp directory where imageCFC stores temporary files.  See the API documentation for details.  The property name is "tempDirectory".

2.18 - July 10, 2007
- deleted support for gaussianBlur and boxBlur filters, too slow!
- added private convertImageObject() method which converts image objects to other types.  Primarily used when the image type is of TYPE_CUSTOM (0)
- checked code into subversion!
- changes to test-cases.cfm
- canModify value in struct is now ALWAYS "true" until someone tells me they can't modify an image.

2.17 - June 1, 2007
- The following changes were made in order to better support CFFM 1.16.
- imageObject.cfc modified to call image.cfc readImage() method with
  second argument = "no" so it would still work with non-modifiable images
- all imagecfc methods that attempt to modify an image will now 
  throw an error if the image type = 0 (TYPE_CUSTOM).
 
2.16 - May 30, 2007
- NOTE: ALL CODE CHANGES in this version to image.cfc only!
- corrected bug in getImageInfo() method, caused error attempting to call
  getImageMetadata() function on image object (only works on file handles)
- Fixed varscope issues
- built and included several test cases
- Added ability to use "built in" java fonts for addText() method (see documentation)

2.15 - May 29, 2007
- NOTE: ALL CODE CHANGES in this version to image.cfc only!
- corrected documentation bug in docs/readImage.cfc
- Modified readImageFromFile() to return java file object in order to retrieve image metadata
- added getImageMetadata() method (private, called by getImageInfo())
- modified getImageInfo() to include image metadata
- fixed bug in writeImage() method which caused it to not return errors properly.
- Numerous changes to many methods to make reading of images more consistent.
- properly var scoped everything

2.14 - March 7, 2007
- Added "cropToExact" option to resize() method
- adjusted scaleWidth() and scaleHeight() methods to pass
  preserveAspect and cropToExact values ("False") to the
  resize method
- added "cropToExact" argument to resize() method of imageObject.cfc

2.13 - January 25, 2007
- Added try/catch code to imageio.read() method called in the
  readImageFromFile() method.  Attempting to read CMYK jpeg images
  (and other unsupported types) would cause unfriendly errors.

2.12 - December 26, 2006
- corrected bug in throw() method where retVal should have been initialized
  as StructNew()
- Added more error trapping to getImageInfo() method in case readImage() method
  fails to load the image.

2.11 - December 18, 2006
- Added getImageInfo() and getImageObject() methods to
  ImageObject.cfc (object oriented interface to image.cfc)
  No version change.

2.11 - December 14, 2006
- performance improvements to gaussianFilter.cfc
- performance improvements to boxBlurFilter.cfc
- Corrected bugs with getOption() method
- Added object oriented interface CFC ImageObject.cfc
  (see file for example code)
- corrected documentation error in docs/getOption.cfm

2.10 - December 13, 2006
- added filterGaussianBlur()
- added filterBoxBlur()
- added filterFastBlur()
- added filterSharpenFilter()
- added filterPosterizeFilter()
- the above filters are implemented via separate CFCs

2.00 - December 8, 2006
- added javacast to arguments of java methods requiring specific
  numeric data types to prevent problems with coldfusion variables
  being seen as doubles when java is looking for ints.
- converted readImage() and writeImage() to public methods
- writeImage() method writes to temp directory and then uses cffile to move
  image to its final destination.  This corrects a known issue
  where resizing an image down and saving it to the same file did
  not actually reduce the physical file size.
- added better error checking to writeImage() method.
- readImageFromFile() uses fileExists() to determine if a file
  exists before attempting to read it now.
- added additional error checking to readImageFromURL()
- changed scaleX() to scaleWidth()
- changed scaleY() to scaleHeight()
- Added optional preserveAspect argument to resize() method
  (allowing you to resize an image to fit within a certain width
  and height without messing with the aspect ratio)
- Added more rendering hints
- Added new setOption() and getOption() methods that allow you to
  set the various CFC options, such as text anti-aliasing and 
  interpolation mode.
- WROTE REAL API DOCUMENTATION!

2.00b3
- permission denied errors and directory path issues no longer cause
  untrapped exceptions during file write operations.

2.00b2
- fixed stuff
- add
