OptimizerConfig getDefaultConfigWithJpegConversionDisabled() { OptimizerConfig defaultConfig = new OptimizerConfig(); return new OptimizerConfig(defaultConfig.getMaxInMemoryBytes(), defaultConfig.getMaxPaletteSize(), false, defaultConfig.getJpegCompression(), defaultConfig.getMinThresholdBytes(), defaultConfig.getJpegHuffmanOptimization(), defaultConfig.getJpegRetainSubsampling()); }
OptimizerConfig getConfigWithRetainSampling(boolean enabled, float quality) { OptimizerConfig defaultConfig = new OptimizerConfig(); return new OptimizerConfig(defaultConfig.getMaxInMemoryBytes(), defaultConfig.getMaxPaletteSize(), defaultConfig.isJpegConversionAllowed(), quality, defaultConfig.getMinThresholdBytes(), defaultConfig.getJpegHuffmanOptimization(), enabled); } }
@Override protected void rewriteImpl(BufferedImage image) throws IOException { // Create a new optimizer config and disable JPEG conversion OptimizerConfig pngConfig = new OptimizerConfig(config.getMaxInMemoryBytes(), config.getMaxPaletteSize(), false, config.getJpegCompression(), config.getMinThresholdBytes()); // Output the image as PNG PNGOptimizer pngOptimizer = new PNGOptimizer(pngConfig, response); pngOptimizer.rewriteImpl(image); int pngLength = Integer.MAX_VALUE; if (pngOptimizer.getRewrittenImage() != null) { // PNG was better than original so use it minBytes = pngOptimizer.getRewrittenImage(); minLength = minBytes.length; pngLength = minLength; } // Write as standard JPEG using the configured default compression level write(image); // JPEG did not beat PNG if (pngLength == minLength) { usePng = true; } }
@Override protected void rewriteImpl(BufferedImage bufferedImage) throws IOException { BufferedImage palettized = ImageUtils.palettize(bufferedImage, config.getMaxPaletteSize()); if (palettized != null) { write(palettized); config.getMaxInMemoryBytes()); if (depalettized != null) { write(depalettized); if (config.isJpegConversionAllowed()) { boolean isOpaque; if (palettized != null){ ImageWriteParam param = writer.getDefaultWriteParam(); param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(config.getJpegCompression()); outputter = new ImageIOOutputter(writer, param); write(rgbOnlyImage);
@Test public void testForHighJpegCompression() { OptimizerConfig config = new OptimizerConfig(1024 * 1024, 256, true, 1.00f, 200, false, false); assertEquals(0.9f, config.getJpegCompression(), 0.0001); }
HttpResponse rewrite(HttpResponse original) throws Exception { return rewrite(original, new OptimizerConfig()); }
@Override protected void rewriteImpl(BufferedImage bufferedImage) throws IOException { BufferedImage palettized = ImageUtils.palettize(bufferedImage, config.getMaxPaletteSize()); if (palettized != null) { write(palettized); config.getMaxInMemoryBytes()); if (depalettized != null) { write(depalettized); if (config.isJpegConversionAllowed()) { boolean isOpaque; if (palettized != null){
protected ImageOutputter getOutputter() { Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(getOriginalFormatName()); if (writers.hasNext()) { ImageWriter writer = writers.next(); ImageWriteParam param = writer.getDefaultWriteParam(); if (getOriginalFormatName().equals("jpeg")) { param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(config.getJpegCompression()); if (param instanceof JPEGImageWriteParam) { ((JPEGImageWriteParam) param).setOptimizeHuffmanTables( config.getJpegHuffmanOptimization()); } } JpegImageUtils.SamplingModes samplingMode = JpegImageUtils.SamplingModes.DEFAULT; if (config.getJpegRetainSubsampling() && sourceImageParams != null) { samplingMode = sourceImageParams.getSamplingMode(); } return new ImageIOOutputter(writer, param, samplingMode); } return new SanselanOutputter(FORMAT_NAME_TO_IMAGE_FORMAT.get(getOriginalFormatName())); }
/** * @param requestedHeight the requested image height, assumed always nonnegative * @param requestedWidth the requested image width, assumed always nonnegative * @param imageInfo the image information to analyze * @return {@code true} if the image size given by the parameters is too large to be acceptable * for serving */ private boolean isTargetImageTooLarge(int requestedHeight, int requestedWidth, ImageInfo imageInfo) { long imagePixels = abs(requestedHeight) * abs(requestedWidth); long imageSizeBits = imagePixels * imageInfo.getBitsPerPixel(); return imageSizeBits > config.getMaxInMemoryBytes() * BITS_PER_BYTE; }
if (response.getContentLength() < config.getMinThresholdBytes()) { return;
protected ImageOutputter getOutputter() { Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(getOriginalFormatName()); if (writers.hasNext()) { ImageWriter writer = writers.next(); ImageWriteParam param = writer.getDefaultWriteParam(); if (getOriginalFormatName().equals("jpeg")) { param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(config.getJpegCompression()); } return new ImageIOOutputter(writer, param); } return new SanselanOutputter(FORMAT_NAME_TO_IMAGE_FORMAT.get(getOriginalFormatName())); }
@Override protected void rewriteImpl(BufferedImage image) throws IOException { // Create a new optimizer config and disable JPEG conversion OptimizerConfig pngConfig = new OptimizerConfig(config.getMaxInMemoryBytes(), config.getMaxPaletteSize(), false, config.getJpegCompression(), config.getMinThresholdBytes()); // Output the image as PNG PNGOptimizer pngOptimizer = new PNGOptimizer(pngConfig, response); pngOptimizer.rewriteImpl(image); int pngLength = Integer.MAX_VALUE; if (pngOptimizer.getRewrittenImage() != null) { // PNG was better than original so use it minBytes = pngOptimizer.getRewrittenImage(); minLength = minBytes.length; pngLength = minLength; } // Write as standard JPEG using the configured default compression level write(image); // JPEG did not beat PNG if (pngLength == minLength) { usePng = true; } }
@Override protected void rewriteImpl(BufferedImage bufferedImage) throws IOException { BufferedImage palettized = ImageUtils.palettize(bufferedImage, config.getMaxPaletteSize()); if (palettized != null) { write(palettized); config.getMaxInMemoryBytes()); if (depalettized != null) { write(depalettized); if (config.isJpegConversionAllowed()) { boolean isOpaque; if (palettized != null){ ImageWriteParam param = writer.getDefaultWriteParam(); param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(config.getJpegCompression()); outputter = new ImageIOOutputter(writer, param); write(rgbOnlyImage);
@Test public void testForHighJpegCompression() { OptimizerConfig config = new OptimizerConfig(1024 * 1024, 256, true, 1.00f, 200, false, false); assertEquals(0.9f, config.getJpegCompression(), 0.0001); }
HttpResponse rewrite(HttpResponse original) throws Exception { return rewrite(original, new OptimizerConfig()); }
/** * @param requestedHeight the requested image height, assumed always nonnegative * @param requestedWidth the requested image width, assumed always nonnegative * @param imageInfo the image information to analyze * @return {@code true} if the image size given by the parameters is too large to be acceptable * for serving */ private boolean isTargetImageTooLarge(int requestedHeight, int requestedWidth, ImageInfo imageInfo) { long imagePixels = abs(requestedHeight) * abs(requestedWidth); long imageSizeBits = imagePixels * imageInfo.getBitsPerPixel(); return imageSizeBits > config.getMaxInMemoryBytes() * BITS_PER_BYTE; }
if (response.getContentLength() < config.getMinThresholdBytes()) { return;
protected ImageOutputter getOutputter() { Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(getOriginalFormatName()); if (writers.hasNext()) { ImageWriter writer = writers.next(); ImageWriteParam param = writer.getDefaultWriteParam(); if (getOriginalFormatName().equals("jpeg")) { param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(config.getJpegCompression()); } return new ImageIOOutputter(writer, param); } return new SanselanOutputter(FORMAT_NAME_TO_IMAGE_FORMAT.get(getOriginalFormatName())); }
OptimizerConfig getDefaultConfigWithJpegConversionDisabled() { OptimizerConfig defaultConfig = new OptimizerConfig(); return new OptimizerConfig(defaultConfig.getMaxInMemoryBytes(), defaultConfig.getMaxPaletteSize(), false, defaultConfig.getJpegCompression(), defaultConfig.getMinThresholdBytes(), defaultConfig.getJpegHuffmanOptimization(), defaultConfig.getJpegRetainSubsampling()); }
OptimizerConfig getConfigWithRetainSampling(boolean enabled, float quality) { OptimizerConfig defaultConfig = new OptimizerConfig(); return new OptimizerConfig(defaultConfig.getMaxInMemoryBytes(), defaultConfig.getMaxPaletteSize(), defaultConfig.isJpegConversionAllowed(), quality, defaultConfig.getMinThresholdBytes(), defaultConfig.getJpegHuffmanOptimization(), enabled); } }