package filter.filters; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.stream.MemoryCacheImageOutputStream; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import filter.base.ImageFilter; public class JPEGFilter extends ImageFilter { public float compressionLevel; @Override protected boolean randomControls() { return false; } @Override public BufferedImage apply(BufferedImage img) { if(compressionLevel == 0f) return img; try { ImageWriter iw = ImageIO.getImageWritersByFormatName("jpeg").next(); JPEGImageWriteParam iwp = (JPEGImageWriteParam) iw.getDefaultWriteParam(); iwp.setOptimizeHuffmanTables(false); iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED); iwp.setCompressionQuality(1f-compressionLevel); ByteArrayOutputStream baos = new ByteArrayOutputStream(); iw.setOutput(new MemoryCacheImageOutputStream(baos)); IIOImage outputImage = new IIOImage(img, null, null); iw.write(null, outputImage, iwp); iw.dispose(); baos.flush(); byte[] returnImage = baos.toByteArray(); baos.close(); BufferedImage img2 = ImageIO.read(new ByteArrayInputStream(returnImage)); if(img2 == null) throw new Exception(); else img = img2; } catch (Exception e) { e.printStackTrace(); } return img; } }