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())); }
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); } }
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); } }
OptimizerConfig getDefaultConfigWithJpegConversionDisabled() { OptimizerConfig defaultConfig = new OptimizerConfig(); return new OptimizerConfig(defaultConfig.getMaxInMemoryBytes(), defaultConfig.getMaxPaletteSize(), false, defaultConfig.getJpegCompression(), defaultConfig.getMinThresholdBytes(), defaultConfig.getJpegHuffmanOptimization(), defaultConfig.getJpegRetainSubsampling()); }
OptimizerConfig getDefaultConfigWithJpegConversionDisabled() { OptimizerConfig defaultConfig = new OptimizerConfig(); return new OptimizerConfig(defaultConfig.getMaxInMemoryBytes(), defaultConfig.getMaxPaletteSize(), false, defaultConfig.getJpegCompression(), defaultConfig.getMinThresholdBytes(), defaultConfig.getJpegHuffmanOptimization(), defaultConfig.getJpegRetainSubsampling()); }
@Override protected void rewriteImpl(BufferedImage image) throws IOException { int pngLength = Integer.MAX_VALUE; if (config.isJpegConversionAllowed()) { // Create a new optimizer config and disable JPEG conversion OptimizerConfig pngConfig = new OptimizerConfig(config.getMaxInMemoryBytes(), config.getMaxPaletteSize(), false, config.getJpegCompression(), config.getMinThresholdBytes(), config.getJpegHuffmanOptimization(), config.getJpegRetainSubsampling()); // Output the image as PNG PNGOptimizer pngOptimizer = new PNGOptimizer(pngConfig, response); pngOptimizer.rewriteImpl(image); 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; } }