Wednesday, 10 February 2016

Java JPEG compression using ImageIO package

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;

public class ImageIo {
   
    public static void main(String args[])
    {
        try {
            new ImageIo().compressImage(new File("/home/aurum/pngtest900kb.png"),"pngtest900kb.png");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

        public String compressImage(File cardImage, String fileName) throws IOException {
       
        File compressedImageFile = new File("/home/aurum/pngtest900kb.png");
       
        InputStream is = new FileInputStream(cardImage);
        OutputStream os = new FileOutputStream(compressedImageFile);           
        float quality = 0.3f;
       
       
        if(cardImage.length() > 2048) {
            quality = 0.2f;
        }
       
        BufferedImage image = ImageIO.read(is);
       
        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
        ImageWriter writer = (ImageWriter) writers.next();
        ImageOutputStream ios = ImageIO.createImageOutputStream(os);
        writer.setOutput(ios);
       
        ImageWriteParam param = writer.getDefaultWriteParam();           
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        param.setCompressionQuality(quality);
        writer.write(null, new IIOImage(image, null, null), param);       
       
        is.close();
        os.close();
        ios.close();
        writer.dispose();
        return compressedImageFile.getName();
    }
}