views:

561

answers:

2

I upload a file with a struts form. I have the image as a byte[] and I would like to scale it.

FormFile file = (FormFile) dynaform.get("file");
byte[] fileData = file.getFileData(); 
fileData = scale(fileData,200,200);

public byte[] scale(byte[] fileData, int width, int height) {
// TODO 
}

Anyone knows an easy function to do this?

public byte[] scale(byte[] fileData, int width, int height) {
     ByteArrayInputStream in = new ByteArrayInputStream(fileData);
     try {
      BufferedImage img = ImageIO.read(in);
      if(height == 0) {
       height = (width * img.getHeight())/ img.getWidth(); 
      }
      if(width == 0) {
       width = (height * img.getWidth())/ img.getHeight();
      }
      Image scaledImage = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
      BufferedImage imageBuff = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
      imageBuff.getGraphics().drawImage(scaledImage, 0, 0, new Color(0,0,0), null);

      ByteArrayOutputStream buffer = new ByteArrayOutputStream();

      ImageIO.write(imageBuff, "jpg", buffer);

      return buffer.toByteArray();
     } catch (IOException e) {
      throw new ApplicationException("IOException in scale");
     }
    }

If you run out of Java Heap Space in tomcat as I did, increase the heap space which is used by tomcat. In case you use the tomcat plugin for Eclipse, next should apply:

In Eclipse, choose Window > Preferences > Tomcat > JVM Settings

Add the following to the JVM Parameters section

-Xms256m -Xmx512m

+3  A: 

Depends on the data format.

However, if you're using something like JPEG, GIF, PNG, or BMP you can use the ImageIO class.

Something like:

public byte[] scale(byte[] fileData, int width, int height) {
     ByteArrayInputStream in = new ByteArrayInputStream(fileData);
     try {
      BufferedImage img = ImageIO.read(in);
      if(height == 0) {
       height = (width * img.getHeight())/ img.getWidth(); 
      }
      if(width == 0) {
       width = (height * img.getWidth())/ img.getHeight();
      }
      Image scaledImage = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
      BufferedImage imageBuff = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
      imageBuff.getGraphics().drawImage(scaledImage, 0, 0, new Color(0,0,0), null);

      ByteArrayOutputStream buffer = new ByteArrayOutputStream();

      ImageIO.write(imageBuff, "jpg", buffer);

      return buffer.toByteArray();
     } catch (IOException e) {
      throw new ApplicationException("IOException in scale");
     }
    }
Kevin Montrose
Please, update your code with the tested code i posted in my question. I will clean the question, and accept your answer.
Sergio del Amo