9

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

Juha Syrjälä
  • 32,255
  • 31
  • 127
  • 179
Sergio del Amo
  • 74,335
  • 67
  • 149
  • 178
  • 1
    __Guessing here__ : JPEG doesn't do transparency. Change the `TYPE_INT_ARGB` to `TYPE_INT_RGB` and `new Color(0,0,0,0)` to `new Color(0,0,0)` – Kevin Montrose Aug 04 '09 at 17:36
  • 1
    As for heap space, you could save some of space by working directly on an input stream instead of reading it into a byte array. However, to scale an image you need a copy of it (and its scaled version) in memory; so you might just have to increase heap space. Look into `java -xmx`. – Kevin Montrose Aug 04 '09 at 18:47

2 Answers2

25

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");
    }
}
Viacheslav Shalamov
  • 3,639
  • 4
  • 38
  • 61
Kevin Montrose
  • 21,711
  • 8
  • 86
  • 136
2

See this:

Java 2D - How to convert byte[] to BufferedImage

Then see this:

How can I resize an image using Java?

Community
  • 1
  • 1
karim79
  • 334,458
  • 66
  • 409
  • 405