diff options
author | jfrijters <jfrijters> | 2009-02-17 11:14:56 +0300 |
---|---|---|
committer | jfrijters <jfrijters> | 2009-02-17 11:14:56 +0300 |
commit | e754c19e757b0b90b1a258aef333104a133a92b4 (patch) | |
tree | 2761943cc85ff883a353b92f177f8ea1e2a8be25 /openjdk/com | |
parent | 46a4f6c9fb6dfb99ed965d9a975caca462299ed0 (diff) |
Added support for setting the JPEG compression level and for custom quantization (but not huffman) tables.
Diffstat (limited to 'openjdk/com')
-rw-r--r-- | openjdk/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/openjdk/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java b/openjdk/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java index 40f0e6d7..a5891a7c 100644 --- a/openjdk/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java +++ b/openjdk/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java @@ -26,16 +26,25 @@ package com.sun.imageio.plugins.jpeg; import javax.imageio.ImageWriter; import javax.imageio.ImageWriteParam; +import javax.imageio.IIOException; import javax.imageio.IIOImage; import javax.imageio.ImageTypeSpecifier; import javax.imageio.metadata.IIOMetadata; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; +import javax.imageio.plugins.jpeg.JPEGQTable; import javax.imageio.spi.ImageWriterSpi; import javax.imageio.stream.ImageOutputStream; import java.awt.image.BufferedImage; import java.io.IOException; +import cli.System.Drawing.Imaging.Encoder; +import cli.System.Drawing.Imaging.EncoderParameter; +import cli.System.Drawing.Imaging.EncoderParameters; +import cli.System.Drawing.Imaging.ImageCodecFlags; +import cli.System.Drawing.Imaging.ImageCodecInfo; +import cli.System.Drawing.Imaging.ImageFormat; + /** * JPEGImageWriter that use .NET features to write the the JPG file. */ @@ -85,17 +94,79 @@ public class JPEGImageWriter extends ImageWriter { */ @Override public void write(IIOMetadata streamMetadata, IIOImage image, ImageWriteParam param) throws IOException{ + + ImageCodecInfo codec = null; + for (ImageCodecInfo ici : ImageCodecInfo.GetImageEncoders()) { + if (ici.get_FormatID().equals(ImageFormat.get_Jpeg().get_Guid()) + && (ici.get_Flags().Value & ImageCodecFlags.Builtin) != 0) { + codec = ici; + break; + } + } + if (codec == null) { + throw new IIOException("JPEG codec not found"); + } + BufferedImage img = (BufferedImage)image.getRenderedImage(); cli.System.Drawing.Bitmap bitmap = img.getBitmap(); ImageOutputStream imgOutput = (ImageOutputStream)getOutput(); + JPEGImageWriteParam jparam = null; + JPEGQTable[] qTables = null; + + if (param != null) { + switch (param.getCompressionMode()) { + case ImageWriteParam.MODE_DISABLED: + throw new IIOException("JPEG compression cannot be disabled"); + case ImageWriteParam.MODE_EXPLICIT: + float quality = param.getCompressionQuality(); + quality = JPEG.convertToLinearQuality(quality); + qTables = new JPEGQTable[2]; + qTables[0] = JPEGQTable.K1Luminance.getScaledInstance(quality, true); + qTables[1] = JPEGQTable.K2Chrominance.getScaledInstance(quality, true); + break; + case ImageWriteParam.MODE_DEFAULT: + qTables = new JPEGQTable[2]; + qTables[0] = JPEGQTable.K1Div2Luminance; + qTables[1] = JPEGQTable.K2Div2Chrominance; + break; + } + if (param instanceof JPEGImageWriteParam) { + jparam = (JPEGImageWriteParam)param; + } + } + + if (qTables == null) { + if (jparam != null && jparam.areTablesSet()) { + qTables = jparam.getQTables(); + } else { + qTables = JPEG.getDefaultQTables(); + } + } + // Create a MemoryStream with publicly visible buffer cli.System.IO.MemoryStream stream = new cli.System.IO.MemoryStream(1024); - bitmap.Save(stream, cli.System.Drawing.Imaging.ImageFormat.get_Jpeg() ); + EncoderParameters params = new EncoderParameters(2); + try { + params.get_Param()[0] = new EncoderParameter(Encoder.LuminanceTable, qTableToShortArray(qTables[0])); + params.get_Param()[1] = new EncoderParameter(Encoder.ChrominanceTable, qTableToShortArray(qTables[1])); + bitmap.Save(stream, codec, params); + } + finally { + params.Dispose(); + } imgOutput.write(stream.GetBuffer(), 0, (int)stream.get_Length()); } + + private static short[] qTableToShortArray(JPEGQTable table) { + int[] array = table.getTable(); + short[] s = new short[64]; + for (int i = 0; i < 64; i++) + s[i] = (short)array[i]; + return s; + } /** * {@inheritDoc} |