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;
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<ImageWriter> 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);
}