Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjfrijters <jfrijters>2009-02-17 11:14:56 +0300
committerjfrijters <jfrijters>2009-02-17 11:14:56 +0300
commite754c19e757b0b90b1a258aef333104a133a92b4 (patch)
tree2761943cc85ff883a353b92f177f8ea1e2a8be25 /openjdk/com
parent46a4f6c9fb6dfb99ed965d9a975caca462299ed0 (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.java73
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}