tweaks to improve image quality
This commit is contained in:
parent
e9225054b4
commit
c018eba9a2
1 changed files with 25 additions and 2 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue