mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-08-03 03:25:28 -04:00
Documentation + fix for minor issue when quality could not be determined.
This commit is contained in:
parent
465eb2ecb3
commit
7bcfd228b9
@ -37,46 +37,47 @@ import java.io.IOException;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* JPEGQuality
|
* Determines an approximate JPEG compression quality value from the quantization tables.
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
|
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
|
||||||
* @author last modified by $Author: haraldk$
|
* @author last modified by $Author: haraldk$
|
||||||
* @version $Id: JPEGQuality.java,v 1.0 16.02.12 17:07 haraldk Exp$
|
* @version $Id: JPEGQuality.java,v 1.0 16.02.12 17:07 haraldk Exp$
|
||||||
*/
|
*/
|
||||||
public class JPEGQuality {
|
public final 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
|
|
||||||
|
|
||||||
static final int NUM_QUANT_TABLES = 4; /* Quantization tables are numbered 0..3 */
|
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 */
|
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.
|
* 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.
|
* 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.
|
* @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,
|
* @return a float in the range {@code [0...1]}, representing the JPEG quality,
|
||||||
* or {@code -1} if the quality can't be determined.
|
* or {@code -1} if the quality can't be determined.
|
||||||
* @throws IIOException if a JPEG format error is found during parsing.
|
* @throws IIOException if a JPEG format error is found during parsing.
|
||||||
* @throws IOException if an I/O exception occurs during parsing.
|
* @throws IOException if an I/O exception occurs during parsing.
|
||||||
*
|
*
|
||||||
|
* @see javax.imageio.plugins.jpeg.JPEGImageWriteParam#setCompressionQuality(float)
|
||||||
* @see JPEG#DQT
|
* @see JPEG#DQT
|
||||||
*/
|
*/
|
||||||
public static float getJPEGQuality(final List<JPEGSegment> segments) throws IOException {
|
public static float getJPEGQuality(final List<JPEGSegment> 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 {
|
public static float getJPEGQuality(final ImageInputStream input) throws IOException {
|
||||||
return getJPEGQuality(JPEGSegmentUtil.readSegments(input, JPEG.DQT, null));
|
return getJPEGQuality(JPEGSegmentUtil.readSegments(input, JPEG.DQT, null));
|
||||||
}
|
}
|
||||||
@ -242,4 +243,11 @@ public class JPEGQuality {
|
|||||||
|
|
||||||
return tables;
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user