Comments
Richard Davies wrote: The UK has a good crop of technology pioneers in cloud computing - for example ElasticHosts, FlexiScale, Flexiant, OnApp - and also some strong government initiatives such as G-Cloud. We will have to see whether this kind of technical leadership converts into swift mass-market adoption or not.
Cloud Expo on Google News

SYS-CON.TV
Cloud Expo & Virtualization 2009 East
PLATINUM SPONSORS:
IBM
Smarter Business Solutions Through Dynamic Infrastructure
IBM
Smarter Insights: How the CIO Becomes a Hero Again
Microsoft
Windows Azure
GOLD SPONSORS:
Appsense
Why VDI?
CA
Maximizing the Business Value of Virtualization in Enterprise and Cloud Computing Environments
ExactTarget
Messaging in the Cloud - Email, SMS and Voice
Freedom OSS
Stairway to the Cloud
Sun
Sun's Incubation Platform: Helping Startups Serve the Enterprise
POWER PANELS:
Cloud Computing & Enterprise IT: Cost & Operational Benefits
How and Why is a Flexible IT Infrastructure the Key To the Future?
Click For 2008 West
Event Webcasts
CFImage Part 2
Tag-based image manipulation

ColdFusion 8 has a load of awesome image manipulation functionality. So much so, in fact, that it will take several articles to discuss it in any sort of decent way.

In Part 1 of this article (CFDJ, Vol. 9, issue 5), we spent the entire post just exploring all the ways in which ColdFusion 8 can read in and write out/save images. If you haven't read that already, do so now because I won't be explaining the reading/writing of images going forward (I'm assuming that you already understand all the crazy, awesome combinations of ways in which this can be done).

Just as with the reading and writing, image manipulation can be done through both the ColdFusion 8 CFImage tag and through the ColdFusion 8 image manipulation functions. In Part 2, I am going to focus on all the stuff that you can accomplish with just the CFImage tag (and a few of the functions). The CFImage tag provides a very small subset of all that can be done, so I figured it would make for a good primer on manipulation.

In addition to the reading and writing of images, the ColdFusion 8 CFImage tag provides these image manipulation functions:

  • Adding a border
  • Resize image
  • Rotate image
  • Creating a CAPTCHA image
Before we get into any of it, I am just going to start off by saying that I believe that 90% of the image manipulation that people want to accomplish is merely the resizing of uploaded images to create thumbnails (come on, let's be honest). If that's the case, you are going to be tickled pink with excitement. CFImage resizes images fast and with a furious amount of quality. I'm not that surprised, after all, this is Adobe we're talking about - the ruler of the photo and image editing empire.

To help present these image manipulation features a little more clearly, I've created a function called AddImageInfo(). This user-defined ColdFusion function takes in a ColdFusion image object and writes the width and height of the image to the top-left corner of the graphic. This will help us see how the size of the image changes as we manipulate it. The algorithm of the AddImageInfo() function goes beyond the scope of this CFImage article but, hopefully, seeing some of this in Listing 1 will get you more excited about the ColdFusion 8 image editing possibilities.
Even though it's not entirely relevant to this article, there is something I would like to go into a tad bit of detail about (regarding the above UDF) because at first it was throwing me for a loop. Once I get the ColdFusion image object passed in the AddImageInfo() function, I create a copy of it using the ImageCopy() method. I do this because I don't want to corrupt the image that was passed in as it was passed in by reference (not by value).

At first, I thought I would just copy the image using the CFImage tag:

<!---
Copy the image and overwrite the passed in argument
value. Since ColdFusion images are passed around by
reference, this should create a COPY of the image and
then save that new image reference over the one that
was passed in.
--->
<cfimage
action="read"
source="#ARGUMENTS.Image#"
name="ARGUMENTS.Image"
/>

Notice that we are reading in the passed-in ColdFusion image object and then overwriting the ARGUMENTS.Image value. This should have created a new variable value, thereby detaching this reference from the image that was passed in. However, ColdFusion is doing something very strange here - CFImage[ action=read ] does not copy the image to a new variable; it seems to be copying the image data back into the existing variable. To see this in action, take a look at this UDF in Listing 2.

Notice that I am supposedly overwriting the passed in argument with a duplicate of it. Okay, now let's put it into action in Listing 3.
Notice that we are altering the image as we write it to the browser. Since we creating a copy of the image in the UDF, each outputted image should only have one line on it. However, when we run the above code, we get the images shown in Figure 1.

Notice that each AlterImage() call updated the original image data such that each subsequent call built on top of the previous one. Clearly, our CFImage[ action=read ] is not overwriting the variable, ARGUMENTS.Image. This got me thinking - is this complicated by the fact that it was a function or something? I figured I would try this without using a UDF (see Listing 4).

Notice here that we are reading in the image but storing it into a new variable name (objImage versus objNewImage). If this works the same way as the preceding example, objImage and objNewImage should point to the same image data. Yet, when we run the above code, we get the images shown in Figure 2.

In this case, the two variables, objImage and objNewImage, point to independent copies of the image. We know this because, if they pointed to the same image, a border applied to one would show up in both WriteToBrowser tags.

This is very strange behavior, and it feels to me like a bug in the way CFImage handles variable names that overwrite themselves. Anyway, just be careful when reading one image into another image as it might not always do what you expect it to. Just so you know, to make sure I wasn't crazy, I tried something similar with query-based function where the I ran a query that overwrites itself:

<cfquery name="ARGUMENTS.Query" dbtype="query">
SELECT
*
FROM
Query
</cfquery>


About Ben Nadel
Ben Nadel has worked with ColdFusion for eight years and is a super ColdFusion enthusiast. He blogs regularly about all aspects of Web development on his personal site, http://www.bennadel.com, and does his best to give back to the ColdFusion community through online code demos and his "Ask Ben" blog posts. He is also a Certified Advanced ColdFusion MX7 developer and is one of the lead programmers at Nylon Technology.

In order to post a comment you need to be registered and logged in.

Register | Sign-in

Reader Feedback: Page 1 of 1

Test


Your Feedback
andy776 wrote: Test
Latest Cloud Developer Stories
In a surprise move Tuesday Oracle wheeled out its Big Data Appliance. That’s the one it said in October would be ready sometime in the first half. Only nobody believed it meant early in the first half. Heck, it’s not even clear anybody thought Oracle could make the first half...
Rackspace Hosting, the service leader in cloud computing, on Thursday announced its acquisition of SharePoint911, an industry leader in SharePoint consulting, training, and "JumpStart" services within SharePoint. The unification of both companies provides capabilities to deliver ...
Wyse Technology, the global leader in cloud client computing, on Thursday announced it's working with Microsoft to market school IT labs and one-to-one computing solutions that allow a cost effective delivery of innovative IT enabled education. These solutions are available throu...
With Cloud Expo 2012 New York (10th Cloud Expo) now under four months away, what better time to start introducing you in greater detail to the distinguished individuals in our incredible Speaker Faculty for the technical and strategy sessions at the conference... We have techn...
Nimble, the social CRM platform has announced the launch of Nimble 2.0, billed as the “most social” CRM platform on the market today. Nimble was designed entirely with social CRM in mind and is the first social business platform that empowers companies with the ability to get clo...
Subscribe to the World's Most Powerful Newsletters
Subscribe to Our Rss Feeds & Get Your SYS-CON News Live!
Click to Add our RSS Feeds to the Service of Your Choice:
Google Reader or Homepage Add to My Yahoo! Subscribe with Bloglines Subscribe in NewsGator Online
myFeedster Add to My AOL Subscribe in Rojo Add 'Hugg' to Newsburst from CNET News.com Kinja Digest View Additional SYS-CON Feeds
Publish Your Article! Please send it to editorial(at)sys-con.com!

Advertise on this site! Contact advertising(at)sys-con.com! 201 802-3021

SYS-CON Featured Whitepapers
ADS BY GOOGLE

Breaking Cloud Computing News

CSC (NYSE: CSC) today announced that it has been named the Global, Americas and EME...