The Java Developers Almanac 1.4


Order this book from Amazon.

   
Home > List of Packages > javax.imageio  [6 examples]

e699. Compressing a JPEG File

This example implements a method for writing a JPEG file with a specific compression quality. In J2SE 1.4, the compression capability is not functioning properly. This example demonstrates a workaround.
    // Reads the jpeg image in infile, compresses the image,
    // and writes it back out to outfile.
    // compressionQuality ranges between 0 and 1,
    // 0-lowest, 1-highest.
    public void compressJpegFile(File infile, File outfile, float compressionQuality) {
        try {
            // Retrieve jpg image to be compressed
            RenderedImage rendImage = ImageIO.read(infile);
    
            // Find a jpeg writer
            ImageWriter writer = null;
            Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
            if (iter.hasNext()) {
                writer = (ImageWriter)iter.next();
            }
    
            // Prepare output file
            ImageOutputStream ios = ImageIO.createImageOutputStream(outfile);
            writer.setOutput(ios);
    
            // Set the compression quality
            ImageWriteParam iwparam = new MyImageWriteParam();
            iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT) ;
            iwparam.setCompressionQuality(compressionQuality);
    
            // Write the image
            writer.write(null, new IIOImage(rendImage, null, null), iwparam);
    
            // Cleanup
            ios.flush();
            writer.dispose();
            ios.close();
        } catch (IOException e) {
        }
    }
    
    // This class overrides the setCompressionQuality() method to workaround
    // a problem in compressing JPEG images using the javax.imageio package.
    public class MyImageWriteParam extends JPEGImageWriteParam {
        public MyImageWriteParam() {
            super(Locale.getDefault());
        }
    
        // This method accepts quality levels between 0 (lowest) and 1 (highest) and simply converts
        // it to a range between 0 and 256; this is not a correct conversion algorithm.
        // However, a proper alternative is a lot more complicated.
        // This should do until the bug is fixed.
        public void setCompressionQuality(float quality) {
            if (quality < 0.0F || quality > 1.0F) {
                throw new IllegalArgumentException("Quality out-of-bounds!");
            }
            this.compressionQuality = 256 - (quality * 256);
        }
    }

 Related Examples
e694. Reading an Image from a File, InputStream, or URL
e695. Saving a Generated Graphic to a PNG or JPEG File
e696. Listing the Image Formats That Can Be Read and Written
e697. Determining If an Image Format Can Be Read or Written
e698. Determining the Format of an Image in a File


© 2002 Addison-Wesley.