Jpeg encoder exception: Trying to make a thumbail from a jpeg image
in a byte[]
Hi:
I have a web application in asp.net wich I am rewriting to Java. Is
about uploading pictures online. Web system upload perfectly
pictures, but in original size. I would like to upload too a thumbail
version of the big picture. For that, I am using Jpegencoder from
sun, and seems I am doing something bad, coz when I am trying to do
that I get a exception: "nof a jpeg file: start " and so on...
I get the file data from a fileupload (apache commons fileupload), and
since I get the byte array of each picture I save it into a bussiness
object.
The complete code is in here, just in case someone of you could help
me. I am getting extressed coz dont know what coulb be wrong, if
somone of you could help it will be more than great!. Thank you for
your help!
/*
* uploadPictures.java
*
* Created on August 19, 2007, 10:38 PM
*/
package servlets;
import java.awt.Graphics2D;
import java.io.*;
import java.net.*;
import javax.media.jai.JAI;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Iterator;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.awt.Graphics2D;
import java.io.BufferedOutputStream;
import lovaspillando.business.Photo;
/**
*
* @author lovaspillando
* @version
*/
public class uploadPictures extends HttpServlet {
/** Processes requests for both HTTP <code>GET</code> and
<code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
boolean isMultiPart;
isMultiPart = ServletFileUpload.isMultipartContent(request);
DiskFileUpload fu = new DiskFileUpload();
fu.setSizeMax(10240*512);
fu.setSizeThreshold(40960);
fu.setRepositoryPath("/tmp");
try {
Iterator i = fu.parseRequest(request).iterator();
FileItem actual = null;
while (i.hasNext()){
actual = (FileItem)i.next();
String fname = actual.getName();
Photo oPhoto = new Photo();
oPhoto.setDesPhoto("sticked title");
oPhoto.setBytesOriginal(actual.get());
//creating the bufferedImage from a JPEG stream
InputStream in = new
ByteArrayInputStream(actual.get());
JPEGImageDecoder decoder =
JPEGCodec.createJPEGDecoder(in);
BufferedImage image = decoder.decodeAsBufferedImage();
in.close();
//preparing thumbail numbers
int thumbWidth = 150;
int thumbHeight = 150;
double thumbRatio = (double)thumbWidth /
(double)thumbHeight; //ratio for the thumbail
// obtain the picture width and height
int imageWidth = image.getWidth(null);
int imageHeight = image.getHeight(null);
//it will works if the size of image is bigger than thumbail details
if (imageWidth > 150 || imageHeight > 150) {
double imageRatio = (double)imageWidth /
(double)imageHeight; //ratio in the original image
if (thumbRatio < imageRatio) {
thumbHeight = (int)(thumbWidth / imageRatio);
} else {
thumbWidth = (int)(thumbHeight * imageRatio);
}
// scale it to the new size on-the-fly
BufferedImage thumbImage = new
BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D =
thumbImage.createGraphics();
graphics2D.setRenderingHint(java.awt.RenderingHints.KEY_INTERPOLATION,
java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2D.drawImage(image, 0, 0, thumbWidth,
thumbHeight, null);
try {
ByteArrayOutputStream sout = new
ByteArrayOutputStream();
JPEGImageEncoder encoder =
JPEGCodec.createJPEGEncoder(sout);
JPEGEncodeParam param =
encoder.getDefaultJPEGEncodeParam(thumbImage);
int quality = Math.max(0, Math.min(650,
100));
param.setQuality((float)quality / 100.0f,
false);
encoder.setJPEGEncodeParam(param);
encoder.encode(thumbImage, param);
oPhoto.setBytesThumb(sout.toByteArray());
sout.close();
} catch (java.io.IOException ioe) {
ioe.printStackTrace();
}
} // end if image width or height
oPhoto.setBytesThumb(actual.get());
oPhoto.setAlbumID(1);
if(oPhoto.getBytesOriginal().length > 1) {
oPhoto.add();
}
}
} catch (FileUploadException exception) {
}
out.close();
}