 |
AppletTalk.com Java discussions newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
mlevin Guest
|
Posted: Sat May 05, 2007 8:11 pm Post subject: using JAI to create a thumbnail as a JPEG |
|
|
I'm trying to use JAI to create a thumbnail of a JPEG and no matter
what I do, I keep getting the following stack trace:
exception
javax.servlet.ServletException: All factories fail for the operation
"encode"
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:
523)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:
421)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:
224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:
1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause
javax.media.jai.util.ImagingException: All factories fail for the
operation "encode"
javax.media.jai.OperationRegistry.invokeFactory(OperationRegistry.java:
1687)
javax.media.jai.ThreadSafeOperationRegistry.invokeFactory(ThreadSafeOperationRegistry.java:
473)
javax.media.jai.registry.RIFRegistry.create(RIFRegistry.java:332)
javax.media.jai.RenderedOp.createInstance(RenderedOp.java:819)
javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867)
javax.media.jai.RenderedOp.getRendering(RenderedOp.java:888)
javax.media.jai.JAI.createNS(JAI.java:1099)
javax.media.jai.JAI.create(JAI.java:973)
javax.media.jai.JAI.create(JAI.java:1395)
UploadAction.resizeImage(UploadAction.java:111)
UploadAction.execute(UploadAction.java:71)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:
419)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:
224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:
1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause
java.io.IOException: reading encoded JPEG Stream
sun.awt.image.codec.JPEGImageEncoderImpl.writeJPEGStream(Native
Method)
sun.awt.image.codec.JPEGImageEncoderImpl.encode(JPEGImageEncoderImpl.java:
472)
sun.awt.image.codec.JPEGImageEncoderImpl.encode(JPEGImageEncoderImpl.java:
228)
com.sun.media.jai.codecimpl.JPEGImageEncoder.encode(JPEGImageEncoder.java:
277)
com.sun.media.jai.opimage.EncodeRIF.create(EncodeRIF.java:70)
sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
java.lang.reflect.Method.invoke(Method.java:585)
javax.media.jai.FactoryCache.invoke(FactoryCache.java:122)
javax.media.jai.OperationRegistry.invokeFactory(OperationRegistry.java:
1674)
javax.media.jai.ThreadSafeOperationRegistry.invokeFactory(ThreadSafeOperationRegistry.java:
473)
javax.media.jai.registry.RIFRegistry.create(RIFRegistry.java:332)
javax.media.jai.RenderedOp.createInstance(RenderedOp.java:819)
javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867)
javax.media.jai.RenderedOp.getRendering(RenderedOp.java:888)
javax.media.jai.JAI.createNS(JAI.java:1099)
javax.media.jai.JAI.create(JAI.java:973)
javax.media.jai.JAI.create(JAI.java:1395)
UploadAction.resizeImage(UploadAction.java:111)
UploadAction.execute(UploadAction.java:71)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:
419)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:
224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:
1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
The code I'm using is cobbled together from several examples and
clearly I'm not doing something right. Here's what I've got so far:
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.media.jai.Interpolation;
import javax.media.jai.JAI;
import javax.media.jai.OpImage;
import javax.media.jai.RenderedOp;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.sun.media.jai.codec.JPEGEncodeParam;
import com.sun.media.jai.codec.PNGEncodeParam;
import com.sun.media.jai.codec.SeekableStream;
public class UploadAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws
IOException {
String basePath = "C:\\Program Files\\Apache Software Foundation\
\Tomcat 5.5\\webapps\\strutsTest\\";
UploadForm upload = (UploadForm) form;
if (upload.getFile() != null) {
/*
*
*
*
*
*
*/
// open input stream from uploaded file and copy into byte array
InputStream is = new
BufferedInputStream(upload.getFile().getInputStream());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = is.read(buffer, 0, 8192)) != -1) {
bos.write(buffer, 0, bytesRead);
}
bos.close();
is.close();
byte[] image = bos.toByteArray();
// write original (unresized) file
OutputStream os = new BufferedOutputStream(new
FileOutputStream(basePath + upload.getFile().getFileName()));
ByteArrayInputStream bis = new ByteArrayInputStream(image);
bytesRead = 0;
buffer = new byte[8192];
while ((bytesRead = bis.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
// resize image
bis.reset();
OutputStream osThumb = new BufferedOutputStream(new
FileOutputStream(basePath + "THUMB_" +
upload.getFile().getFileName()));
resizeImage(bis, os, 150, 150);
osThumb.close();
// close input stream
bis.close();
}
return mapping.findForward("success");
}
// based on code examples from http://www.i-proving.ca/space/Technologies/Java+Advanced+Imaging,
http://forums.java.net/jive/thread.jspa?messageID=64672 and
http://archives.java.sun.com/cgi-bin/wa?A2=ind0208&L=java-imageio-interest&P=242
private void resizeImage(InputStream is, OutputStream os, int width,
int height) {
// read in the original image from an input stream
SeekableStream s = SeekableStream.wrapInputStream(is, true);
RenderedOp image = JAI.create("stream", s);
((OpImage) image.getRendering()).setTileCache(null);
// now resize the image
double hRatio = ((double) height) / ((double) image.getHeight());
double wRatio = ((double) width) / ((double) image.getWidth());
double scale = Math.min(hRatio, wRatio);
ParameterBlock pb = new ParameterBlock();
pb.addSource(image).add(scale).add(scale);
pb.add(Interpolation.getInstance(Interpolation.INTERP_BICUBIC));
RenderingHints qualityHints = new
RenderingHints(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
RenderedOp resizedImage = JAI.create("SubsampleAverage", pb,
qualityHints);
// lastly, write the newly-resized image to an
// output stream, in a specific encoding
pb = new ParameterBlock();
BufferedImage bi = resizedImage.getAsBufferedImage();
pb.addSource(bi);
pb.add(os);
pb.add("jpeg");
JPEGEncodeParam ep = new JPEGEncodeParam();
ep.setQuality(0.75f);
pb.add(ep);
JAI.create("encode", pb);
}
}
Any suggestions? I'm baffled.
Thanks |
|
| Back to top |
|
 |
Andrew Thompson Guest
|
Posted: Sat May 05, 2007 9:40 pm Post subject: Re: using JAI to create a thumbnail as a JPEG |
|
|
mlevin wrote:
| Quote: | I'm trying to use JAI to create a thumbnail of a JPEG and no matter
what I do, I keep getting the following stack trace:
...
java.io.IOException: reading encoded JPEG Stream
...
Any suggestions? I'm baffled.
|
Whenever a "why cannot 'a' API open 'b' media and do..?"
type question arises, I wonder, did the OP check that the
media in question (or its codec or internal format) is
compatible with the API?
So, can you do operations on this image from the command
line using JAI? Can you do the operation using the example
media supplied* with JAI?
* Is there any example media with JAI?
Note also that servlets and serverside code is harder
to develop and debug than command line classes, so
I advise getting an example running, that works from
the command line - before wonderring why the servlet
breaks.
--
Andrew Thompson
http://www.athompson.info/andrew/
Message posted via JavaKB.com
http://www.javakb.com/Uwe/Forums.aspx/java-gui/200705/1 |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|