From c018eba9a2c57157ed9ecc6add87c116164ac438 Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 12 Jan 2009 03:53:38 +0000 Subject: [PATCH] tweaks to improve image quality --- .../forkalsrud/album/web/AlbumServlet.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/org/forkalsrud/album/web/AlbumServlet.java b/src/org/forkalsrud/album/web/AlbumServlet.java index 29f4fa6..f061df8 100644 --- a/src/org/forkalsrud/album/web/AlbumServlet.java +++ b/src/org/forkalsrud/album/web/AlbumServlet.java @@ -1,15 +1,21 @@ package org.forkalsrud.album.web; import java.awt.Graphics2D; +import java.awt.RenderingHints; import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; import java.io.File; import java.io.IOException; import java.util.Iterator; +import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; +import javax.imageio.ImageTypeSpecifier; +import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageOutputStream; @@ -152,6 +158,7 @@ public class AlbumServlet ImageInputStream iis = ImageIO.createImageInputStream(file); reader.setInput(iis, true); ImageReadParam param = reader.getDefaultReadParam(); +// param.setDestinationType(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB)); if (false /* subsampling */) { double subSampleScale = (double)outd.getWidth() / orig.getWidth(); int subSampling = (int)Math.floor(0.25d/subSampleScale); @@ -160,7 +167,7 @@ public class AlbumServlet } } BufferedImage img = reader.read(0, param); - + // Recalculate scale after sub-sampling was applied double scale; AffineTransform xform; @@ -175,16 +182,32 @@ public class AlbumServlet scale = (double)outd.getWidth() / img.getWidth(); xform = AffineTransform.getScaleInstance(scale, scale); } +// AffineTransformOp operation = new AffineTransformOp(xform, AffineTransformOp.TYPE_BICUBIC); +// BufferedImage buf2 = operation.createCompatibleDestImage(img, img.getColorModel()); BufferedImage buf2 = new BufferedImage(outd.getWidth(), outd.getHeight(), img.getType()); + +// operation.filter(img, buf2); + Graphics2D g2 = buf2.createGraphics(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g2.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); + g2.transform(xform); g2.drawImage(img, 0, 0, null); +// g2.drawImage(img, operation, 0, 0); + + Iterator writers = ImageIO.getImageWritersByFormatName("jpg"); ImageWriter writer = writers.next(); + ImageWriteParam wParam = writer.getDefaultWriteParam(); + wParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + wParam.setCompressionQuality(1.0f); ImageOutputStream ios = ImageIO.createImageOutputStream(res.getOutputStream()); writer.setOutput(ios); - writer.write(buf2); + writer.write(null, new IIOImage(buf2, null, null), wParam); }