For those who have gotten the following error:
"java.awt.color.CMMException: Invalid image format" and tried
the solutions posted here with no avail.
We are going to use the power of Java's JAI (Java Advanced Imaging) library to tackle this one.
Specifically speaking, the EXIF format vs. the JFIF format.
Read this for more information on these two standards.
Some cameras only add the EXIF segment to the file header of the jpeg and images from those cameras are the ones I see issues with.
To see some samples of this, check out the images on this website.
Download some of those images and see if your image processing code can handle them!
To get more information on your images check out this page and it will tell you all about it, including if the image has JFIF or EXIF segments added.
If anyone has questions about the above code, please don't hesitate to ask.
Hope this helps some of you, since I could not find any solution out there.
"java.awt.color.CMMException: Invalid image format" and tried
the solutions posted here with no avail.
We are going to use the power of Java's JAI (Java Advanced Imaging) library to tackle this one.
<cfscript> //path to image imagePath = "pathToImage"; //create java file object, passing in path to image imageFile = createObject("java","java.io.File").init(imagePath); //create a FileSeekableStream, passing in the image file we created fss = createObject("java","com.sun.media.jai.codec.FileSeekableStream").init(imageFile); //create ParameterBlock object and initialize it (call constructor) pb = createObject("java","java.awt.image.renderable.ParameterBlock").init(); //pass in FileSeekableStream pb.add(fss); //create JAI object that will ultimately do the magic we need JAI = createObject("java","javax.media.jai.JAI"); //use the JAI object to create a buffered jpeg image using the parameter block we just created buffImage = JAI.create("jpeg", pb).getAsBufferedImage(); //pass the buffered image to the ColdFusion imagenew() method. New_Image = imagenew(buffImage); //make sure we close the stream, or you'll pay for it later fss.close(); </cfscript>From what I could find CF/Java chokes on some jpeg's due to their format.
Specifically speaking, the EXIF format vs. the JFIF format.
Read this for more information on these two standards.
Some cameras only add the EXIF segment to the file header of the jpeg and images from those cameras are the ones I see issues with.
To see some samples of this, check out the images on this website.
Download some of those images and see if your image processing code can handle them!
To get more information on your images check out this page and it will tell you all about it, including if the image has JFIF or EXIF segments added.
If anyone has questions about the above code, please don't hesitate to ask.
Hope this helps some of you, since I could not find any solution out there.
We use imagemagik -strip http://www.imagemagick.org/script/command-line-options.php?#strip
ReplyDeleteThanks Henry, I have heard of others using this.
DeleteDo you have more information on how this can be used as another option when processing images with ColdFusion?
Also, does this work on both Windows and Linux?
This comment has been removed by a blog administrator.
ReplyDeletethanks man!
ReplyDeleteyou saved me :D
best regards from brazil
I wanted to add that it's important to use ImageNew() vs the cfimage tag.
ReplyDeleteThe cfimage tag will not accept a buffered file object as an argument for the "source" attribute (you will get an "The cfimage tag accepts only those ColdFusion variables that contain Base64 strings, BLOBs, Byte arrays or other images as inputs." error).
This comment has been removed by the author.
ReplyDeleteWanted to edit my previous comment. Thanks for positing this, helped me out today. Have you noticed any performance issues using this?
ReplyDeleteI added try/catch code around the initial CF imageNew() and will execute the JAI stuff on exception. CPU use was really high when running JAI, so I will only fire that code when needed. Thanks again!
ReplyDelete