Using The Quality Attribute With The CFImage WriteToBrowser Action

Posted August 3, 2012 at 9:33 AM by Ben Nadel

Tags: ColdFusion

The other day, I needed to do some on-the-fly conversion of PNG image files to JPG format in ColdFusion. This was part of stop-gap measure at InVision for mobile devices that can handle more JPG data than they can PNG data. ColdFusion makes this kind of process super simple with the WriteToBrowser action of the CFImage tag. All I had to do was the following:

  • <!--- Convert PNG to JPG on the fly and write IMG tag to browser. --->
  • <cfimage
  • action="writeToBrowser"
  • source="#pngFilePath#"
  • format="jpg"
  • />

This worked well; however, I noticed that some of the JPG images had undesirable compression artifacts showing up. It occurred to me that the quality setting used to convert the PNG image to JPG was less than 1 (ie. less than 100% quality).

After looking at the ColdFusion documentation, I didn't see any way to change the quality of the resultant JPG. So, as an experiment, I tried to add the "quality" attribute to the CFImage tag. Since this attribute works with other CFImage actions, I figured, though undocumented, it might work with the WriteToBrowser action.

And, it did!

To see this in action, I put together a simple ColdFusion script that outputs three images using three different CFImage-WriteToBrowser settings:

  • Default setting (guessing it's ~ 75% quality).
  • Quality 100% (ie. 1).
  • Quality 20% (ie. 0.2).

NOTE: I am guessing the default quality is 75% since this is the documented default value for CFImage-Write actions.

Take a look:

  • <!--- Read in our PNG image. --->
  • <cfset png = imageNew( "./pull.png" ) />
  •  
  •  
  • <!--- Write out as a JPG (default settings). --->
  • <cfimage
  • action="writeToBrowser"
  • source="#png#"
  • format="jpg"
  • />
  •  
  • <br />
  • <br />
  •  
  • <!--- Write out as a JPG at 100% (using "quality" attribute). --->
  • <cfimage
  • action="writeToBrowser"
  • source="#png#"
  • format="jpg"
  • quality="1"
  • />
  •  
  • <br />
  • <br />
  •  
  • <!--- Write out as a JPG at 20% (using "quality" attribute). --->
  • <cfimage
  • action="writeToBrowser"
  • source="#png#"
  • format="jpg"
  • quality=".2"
  • />

And here is what the page output looks like:


 
 
 

 
 CFImage WriteToBrowser quality can be changed using the quality attribute. 
 
 
 

As you can see, the second image with explicit quality of "1" has less compression artifacts than the first image at whatever the default quality setting is.

I don't know if this is an unintended side-effect of the underlying "write" action that ColdFusion must be performing; or, if this is simply a mistake in the documentation? But, it's pretty cool that this works.




Reader Comments

Aug 4, 2012 at 8:35 AM // reply »
8 Comments

My fiendish plan to spoil your day has been foiled by you figuing out the problem AND because I'm leaving the first comment thereby MAKING your day!


Aug 4, 2012 at 2:46 PM // reply »
11,243 Comments

@Evil Ben,

Ha ha, you're a nut!


Post A Comment

Comment Etiquette: Please do not post spam. Please keep the comments on-topic. Please do not post unrelated questions or large chunks of code. And, above all, please be nice to each other - we're trying to have a good conversation here.

Please review the following issues:

Author Name:


Author Email:

Author Website:

Comment:

Supported HTML tags for formatting: <strong>bold</strong>   <em>italic</em>   <code>code</code>







  • Help Wanted - Find Your Next ColdFusion Job
Ben Nadel's Company - Epicenter Consulting Recent Blog Comments
May 23, 2013 at 11:06 AM
Strange Interaction Between DeserializeJson(), ArrayContains(), And Database Values In ColdFusion
@Ben, Are you talking about As Number: YES As String: YES As Java: YES? If so, that's with 3 different ways of referencing the constant 1, not users.id[1]. Query object references(*) are what seem ... read »
May 23, 2013 at 9:55 AM
Strange Interaction Between DeserializeJson(), ArrayContains(), And Database Values In ColdFusion
@Dan, According to the CF Admin, I'm running Java "1.6.0_45". As far as the DB column, in the database it's an INT. I'll see if I can dig into what CF sees it as. @WebManWalking, But h ... read »
May 23, 2013 at 9:49 AM
Strange Interaction Between DeserializeJson(), ArrayContains(), And Database Values In ColdFusion
@Ben, I think the problem is that we're used to loose typing in ColdFusion, like JavaScript. If a value is a number but it's needed in an expression to be a string, noooo problem. I've encountered ... read »
May 23, 2013 at 9:47 AM
ColdFusion QueryAppend( qOne, qTwo )
You rock! Thank you, thank you, thank you!!! ... read »
May 23, 2013 at 5:19 AM
Ask Ben: Print Part Of A Web Page With jQuery
How to print also the background color of table cells and table lines ... read »
May 23, 2013 at 3:55 AM
Javascript Array Methods: Unshift(), Shift(), Push(), And Pop()
very interesting and helpful too. ... read »
May 22, 2013 at 5:35 PM
Script Tags, jQuery, And Html(), Text() And Contents()
This is still an issue 2 years later. jQuery is supposed to remediate these cross browser issues, no? I have been unable to find any statement from the jQuery team calling this behavior "by de ... read »
May 22, 2013 at 12:44 PM
Ask Ben: Query Loop Inside CFScript Tags
In cf10, if you call a function that has: local.result = {}; local.result.msg = ""; local.svc = new query(); local.svc.setSQL("SELECT * FROM..."); local.obj = local.svc.exe ... read »
InVision App - Prototyping Made Beautiful With Prototyping Tools