Languages
[Edit]
EN

Java - save BufferedImage to JPG file with quality

4 points
Created by:
illona
526

In this article, we want to show how to save BufferedImage to PNG file with quality using Java.

Practical example

Program.java file:

package com.example;

import java.awt.image.BufferedImage;
import java.io.IOException;

public class Program {

    public static void main(String[] args) throws IOException {

        BufferedImage image = ...;
        JpegUtils.writeImage(image, "image.jpg", 0.75f);  // quality from 0.0f to 1.0f (from 0% to 100%)
    }
}

 

JpegUtils.java file:

package com.example;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.NoSuchElementException;

import javax.imageio.IIOImage;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.spi.IIORegistry;
import javax.imageio.spi.ImageWriterSpi;
import javax.imageio.spi.ServiceRegistry.Filter;
import javax.imageio.stream.FileImageOutputStream;
import javax.imageio.stream.ImageOutputStream;

public class JpegUtils {
 
    private static final ImageWriterSpi SPI;

	static {
		IIORegistry registry = IIORegistry.getDefaultInstance();
		Filter filter = (Object object) -> {
			ImageWriterSpi spi = (ImageWriterSpi) object;
			for (String type : spi.getMIMETypes()) {
				if ("image/jpeg".equals(type)) {
					return true;
				}
			}
			return false;
		};
		Iterator<ImageWriterSpi> iterator = registry.getServiceProviders(ImageWriterSpi.class, filter, true);
		try {
		    SPI = iterator.next();
		} catch (NoSuchElementException ex) {
	        throw new RuntimeException("JPEG image writer is not supported.", ex);
        }
	}

    private JpegUtils() {
        // Nothing here ...
    }

    public static void writeImage(BufferedImage image, String path, float quality) throws IOException {
        File file = new File(path);
        IIOImage container = new IIOImage(image, null, null);
        ImageWriteParam parameter = new JPEGImageWriteParam(null);
        parameter.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        parameter.setCompressionQuality(quality);
        try (ImageOutputStream stream = new FileImageOutputStream(file)) {
            ImageWriter writer = SPI.createWriterInstance();
            try {
                writer.setOutput(stream);
                writer.write(null, container, parameter);
            } finally {
                writer.dispose();
            }
        }
    }
}

Note: the reasone why SPI is used is optimization by searching for ImageWriterSpi instance once and later using it to create ImageWriter object when needed.

 

Alternative titles

  1. Java - save BufferedImage to JPEG file with quality
Donate to Dirask
Our content is created by volunteers - like Wikipedia. If you think, the things we do are good, donate us. Thanks!
Join to our subscribers to be up to date with content, news and offers.
Native Advertising
🚀
Get your tech brand or product in front of software developers.
For more information Contact us
Dirask - we help you to
solve coding problems.
Ask question.

❤️💻 🙂

Join