diff --git a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGQuality.java b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGQuality.java index 49dd9089..f609148c 100644 --- a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGQuality.java +++ b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGQuality.java @@ -37,46 +37,47 @@ import java.io.IOException; import java.util.List; /** - * JPEGQuality + * Determines an approximate JPEG compression quality value from the quantization tables. * * @author Harald Kuhr * @author last modified by $Author: haraldk$ * @version $Id: JPEGQuality.java,v 1.0 16.02.12 17:07 haraldk Exp$ */ -public class JPEGQuality { - // TODO: Something for the metadata.jpeg package? - // TODO: Make a test that verifies that the values are in line with parameter set to JPEGImageWriter - +public final class JPEGQuality { static final int NUM_QUANT_TABLES = 4; /* Quantization tables are numbered 0..3 */ static final int DCT_SIZE_2 = 64; /* DCT_SIZE squared; # of elements in a block */ - public static void main(String[] args) throws IOException { - for (String arg : args) { - float quality = getJPEGQuality(ImageIO.createImageInputStream(new File(arg))); - System.err.println(arg + " quality: " + quality + "/" + (int) (quality * 100)); - } - } - - // TODO: Do we want 1-100 (%) or 0-1 (float) as result? The latter is more in line with the quality parameter given - // to the writer (in JPEGImageWriteParam). OTOH, it should also be possible to instruct the writer to use the tables - // from the original image directly, which would provide more "accurate" results. /** * Determines an approximate JPEG compression quality value from the quantization tables. * The value will be in the range {@code [0...1]}, where {@code 1} is the best possible value. * - * * @param segments a list of JPEG segments containing the DQT quantization tables. * @return a float in the range {@code [0...1]}, representing the JPEG quality, * or {@code -1} if the quality can't be determined. * @throws IIOException if a JPEG format error is found during parsing. * @throws IOException if an I/O exception occurs during parsing. * + * @see javax.imageio.plugins.jpeg.JPEGImageWriteParam#setCompressionQuality(float) * @see JPEG#DQT */ public static float getJPEGQuality(final List segments) throws IOException { - return getJPEGQuality(getQuantizationTables(segments)) / 100f; + int quality = getJPEGQuality(getQuantizationTables(segments)); + return quality >= 0 ? quality / 100f : quality; } + /** + * Determines an approximate JPEG compression quality value from the quantization tables. + * The value will be in the range {@code [0...1]}, where {@code 1} is the best possible value. + * + * @param input an image input stream containing JPEG data. + * @return a float in the range {@code [0...1]}, representing the JPEG quality, + * or {@code -1} if the quality can't be determined. + * @throws IIOException if a JPEG format error is found during parsing. + * @throws IOException if an I/O exception occurs during parsing. + * + * @see javax.imageio.plugins.jpeg.JPEGImageWriteParam#setCompressionQuality(float) + * @see JPEG#DQT + */ public static float getJPEGQuality(final ImageInputStream input) throws IOException { return getJPEGQuality(JPEGSegmentUtil.readSegments(input, JPEG.DQT, null)); } @@ -242,4 +243,11 @@ public class JPEGQuality { return tables; } + + public static void main(String[] args) throws IOException { + for (String arg : args) { + float quality = getJPEGQuality(ImageIO.createImageInputStream(new File(arg))); + System.err.println(arg + " quality: " + quality + "/" + (int) (quality * 100)); + } + } }