tweaks to improve image quality

This commit is contained in:
erik 2009-01-12 03:53:38 +00:00
parent e9225054b4
commit c018eba9a2

View file

@ -1,15 +1,21 @@
package org.forkalsrud.album.web; package org.forkalsrud.album.web;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform; import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Iterator; import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam; import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader; import javax.imageio.ImageReader;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter; import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream; import javax.imageio.stream.ImageOutputStream;
@ -152,6 +158,7 @@ public class AlbumServlet
ImageInputStream iis = ImageIO.createImageInputStream(file); ImageInputStream iis = ImageIO.createImageInputStream(file);
reader.setInput(iis, true); reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam(); ImageReadParam param = reader.getDefaultReadParam();
// param.setDestinationType(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB));
if (false /* subsampling */) { if (false /* subsampling */) {
double subSampleScale = (double)outd.getWidth() / orig.getWidth(); double subSampleScale = (double)outd.getWidth() / orig.getWidth();
int subSampling = (int)Math.floor(0.25d/subSampleScale); int subSampling = (int)Math.floor(0.25d/subSampleScale);
@ -160,7 +167,7 @@ public class AlbumServlet
} }
} }
BufferedImage img = reader.read(0, param); BufferedImage img = reader.read(0, param);
// Recalculate scale after sub-sampling was applied // Recalculate scale after sub-sampling was applied
double scale; double scale;
AffineTransform xform; AffineTransform xform;
@ -175,16 +182,32 @@ public class AlbumServlet
scale = (double)outd.getWidth() / img.getWidth(); scale = (double)outd.getWidth() / img.getWidth();
xform = AffineTransform.getScaleInstance(scale, scale); 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()); BufferedImage buf2 = new BufferedImage(outd.getWidth(), outd.getHeight(), img.getType());
// operation.filter(img, buf2);
Graphics2D g2 = buf2.createGraphics(); 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.transform(xform);
g2.drawImage(img, 0, 0, null); g2.drawImage(img, 0, 0, null);
// g2.drawImage(img, operation, 0, 0);
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg"); Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = writers.next(); ImageWriter writer = writers.next();
ImageWriteParam wParam = writer.getDefaultWriteParam();
wParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
wParam.setCompressionQuality(1.0f);
ImageOutputStream ios = ImageIO.createImageOutputStream(res.getOutputStream()); ImageOutputStream ios = ImageIO.createImageOutputStream(res.getOutputStream());
writer.setOutput(ios); writer.setOutput(ios);
writer.write(buf2); writer.write(null, new IIOImage(buf2, null, null), wParam);
} }