Skip to content

Commit

Permalink
[GEOS-8676] CoveragePPIO: Replacing com.sun... encoders not supported…
Browse files Browse the repository at this point in the history
… by OpenJDK
  • Loading branch information
dromagnoli committed Apr 6, 2018
1 parent c741177 commit 6511138
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 18 deletions.
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
*/ */
public abstract class BinaryPPIO extends ComplexPPIO { public abstract class BinaryPPIO extends ComplexPPIO {


public static final String QUALITY_KEY = "quality";

protected BinaryPPIO(Class externalType, Class internalType, String mimeType) { protected BinaryPPIO(Class externalType, Class internalType, String mimeType) {
super(externalType, internalType, mimeType); super(externalType, internalType, mimeType);
} }
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -7,31 +7,51 @@
import java.awt.image.RenderedImage; import java.awt.image.RenderedImage;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;


import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.GridCoverage2D;

import org.geotools.image.ImageWorker;
import com.sun.media.jai.codec.ImageEncoder; import org.geotools.util.logging.Logging;
import com.sun.media.jai.codecimpl.JPEGImageEncoder;
import com.sun.media.jai.codecimpl.PNGImageEncoder;


/** /**
* Process parameter input / output for GridCoverage on a specific mime type. * Process parameter input / output for GridCoverage on a specific mime type.
* Current implementation only supports PNG/JPEG encoding. * Current implementation only supports PNG/JPEG encoding.
*/ */
public abstract class CoveragePPIO extends BinaryPPIO { public abstract class CoveragePPIO extends BinaryPPIO {


private static float DEFAULT_QUALITY = 0.75f;

private static final Logger LOGGER = Logging.getLogger(CoveragePPIO.class);

protected CoveragePPIO(final String mimeType) { protected CoveragePPIO(final String mimeType) {
super(GridCoverage2D.class, GridCoverage2D.class, mimeType); super(GridCoverage2D.class, GridCoverage2D.class, mimeType);
} }


public abstract ImageEncoder getEncoder(OutputStream os);

@Override @Override
public void encode(Object value, OutputStream outputStream) throws Exception { public void encode(Object value, OutputStream outputStream) throws Exception {
GridCoverage2D gridCoverage = (GridCoverage2D) value; // Call default implementation with no params
RenderedImage renderedImage = gridCoverage.getRenderedImage(); encode(value, null, outputStream);
ImageEncoder encoder = getEncoder(outputStream); }
encoder.encode(renderedImage);
private static float extractQuality(Map<String, Object> encodingParameters) {
float quality = DEFAULT_QUALITY;
if (encodingParameters != null && !encodingParameters.isEmpty() &&
encodingParameters.containsKey(QUALITY_KEY)) {
String compressionQuality = (String) encodingParameters.get(QUALITY_KEY);
try {
quality = Float.parseFloat(compressionQuality);
} catch (NumberFormatException nfe) {
if (LOGGER.isLoggable(Level.INFO)) {
LOGGER.info(
"Specified quality is not valid (it should be in the range [0,1])."
+ " quality = " + compressionQuality
+ "\nUsing default Quality: " + DEFAULT_QUALITY);
}
}
}
return quality;
} }


/** /**
Expand All @@ -47,8 +67,13 @@ public PNGPPIO() {
} }


@Override @Override
public final ImageEncoder getEncoder(OutputStream outputStream) { public void encode(Object value, Map<String, Object> encodingParameters,
return new PNGImageEncoder(outputStream, null); OutputStream outputStream) throws Exception {
GridCoverage2D gridCoverage = (GridCoverage2D) value;
RenderedImage renderedImage = gridCoverage.getRenderedImage();
ImageWorker worker = new ImageWorker(renderedImage);
float quality = extractQuality(encodingParameters);
worker.writePNG(outputStream, "FILTERED", quality, false, false);
} }


@Override @Override
Expand Down Expand Up @@ -81,8 +106,13 @@ public JPEGPPIO() {
} }


@Override @Override
public ImageEncoder getEncoder(OutputStream outputStream) { public void encode(Object value, Map<String, Object> encodingParameters,
return new JPEGImageEncoder(outputStream, null); OutputStream outputStream) throws Exception {
GridCoverage2D gridCoverage = (GridCoverage2D) value;
RenderedImage renderedImage = gridCoverage.getRenderedImage();
ImageWorker worker = new ImageWorker(renderedImage);
float quality = extractQuality(encodingParameters);
worker.writeJPEG(outputStream, "JPEG", quality, false);
} }


@Override @Override
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ public class GeoTiffPPIO extends BinaryPPIO {
protected static final String TILE_WIDTH_KEY = "tilewidth"; protected static final String TILE_WIDTH_KEY = "tilewidth";
protected static final String TILE_HEIGHT_KEY = "tileheight"; protected static final String TILE_HEIGHT_KEY = "tileheight";
protected static final String COMPRESSION_KEY = "compression"; protected static final String COMPRESSION_KEY = "compression";
protected static final String QUALITY_KEY = "quality";


private static final Set<String> SUPPORTED_PARAMS = new HashSet<String>(); private static final Set<String> SUPPORTED_PARAMS = new HashSet<String>();


Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;


import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;


import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.imageio.ImageReader; import javax.imageio.ImageReader;
Expand Down Expand Up @@ -81,12 +84,34 @@ public void testJPEGEncode() throws Exception {
testIsFormat(coverage, ppio, targetJpeg, "JPEG"); testIsFormat(coverage, ppio, targetJpeg, "JPEG");
} }


@Test
public void testEncodeQuality() throws Exception {
GridCoverage2D coverage = getCoverage();
JPEGPPIO ppio = new JPEGPPIO();
Map <String, Object> encodingParams = new HashMap<String, Object>();

File highQualityFile = new File("./target/outputHiQ.jpg");
encodingParams.put(CoveragePPIO.QUALITY_KEY, "0.99");
try (FileOutputStream fos = new FileOutputStream(highQualityFile)) {
ppio.encode(coverage, encodingParams, fos);
}
final long highQualityFileSize = highQualityFile.length();

File lowQualityFile = new File("./target/outputLoQ.jpg");
encodingParams.put(CoveragePPIO.QUALITY_KEY, "0.01");
try (FileOutputStream fos = new FileOutputStream(lowQualityFile)) {
ppio.encode(coverage, encodingParams, fos);
}
final long lowQualityFileSize = lowQualityFile.length();
assertTrue(highQualityFileSize > lowQualityFileSize);
}

private void testIsFormat(GridCoverage2D coverage, CoveragePPIO ppio, private void testIsFormat(GridCoverage2D coverage, CoveragePPIO ppio,
File inputFile, String formatName) throws Exception { File encodedFile, String formatName) throws Exception {
try (FileOutputStream fos = new FileOutputStream(inputFile)) { try (FileOutputStream fos = new FileOutputStream(encodedFile)) {
ppio.encode(coverage, fos); ppio.encode(coverage, fos);
} }
try (FileImageInputStream fis = new FileImageInputStream(inputFile)) { try (FileImageInputStream fis = new FileImageInputStream(encodedFile)) {
ImageReader imageReader = null; ImageReader imageReader = null;
try { try {
imageReader = ImageIO.getImageReaders(fis).next(); imageReader = ImageIO.getImageReaders(fis).next();
Expand Down

0 comments on commit 6511138

Please sign in to comment.