decided to redo my old thumbnail code and found a solution that generates high quality thumbnails by "stepping" down large images in half before getting to the final size. makes high-quality thumbs.
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.awt.image.IndexColorModel;
//import java.io.ByteArrayOutputStream;
//import java.net.URL;
/*
* original thumbnail code from:
*
*
// send file as BufferedImage
file = new URL( pathToFile );
// convert file to buffered image
// byte[] fileByte = fileContents.bytes();
// BufferedImage image = ImageIO.read ( new ByteArrayInputStream ( fileByte ) );
// or from URL() path above
BufferedImage image = ImageIO.read( file );
BufferedImage buffThumb = ThumbnailMaker.createThumbnail(image, maxWidth, maxHeight);
* james@primax.com
*
*
*/
public class ThumbnailMaker {
public static BufferedImage createThumbnail(BufferedImage image, int thWidth, int thHeight) throws Exception {
int w = image.getWidth();
int h = image.getHeight();
BufferedImage thumbnail = new BufferedImage(thWidth, thHeight, BufferedImage.TYPE_INT_RGB);
float scalex = ((float)w) / ((float) thWidth);
float scaley = ((float)h) / ((float) thHeight);
float scale = Math.min(scalex, scaley);
if (scale < 1) scale = 1;
BufferedImage scaled = createResizedImage(image,
Math.round(w/scale), Math.round(h/scale));
Graphics2D g = thumbnail.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, thWidth, thHeight);
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g.drawImage(scaled, (thWidth - scaled.getWidth()) / 2, (thHeight - scaled.getHeight()) / 2, null);
g.dispose();
return thumbnail;
}
private static BufferedImage createResizedImage(BufferedImage img, int targetWidth, int targetHeight) {
if (img.getWidth() == targetHeight && img.getHeight() == targetHeight) return img;
boolean higherQuality = true;
boolean isIndexColorModel = img.getColorModel() instanceof IndexColorModel;
int type;
if (!isIndexColorModel){
type = (img.getTransparency() == Transparency.OPAQUE) ?
BufferedImage.TYPE_INT_RGB :
BufferedImage.TYPE_INT_ARGB;
}
else {type = img.getType();}
BufferedImage ret = (BufferedImage) img;
int w, h;
if (higherQuality) {
w = img.getWidth();
h = img.getHeight();
} else {
w = targetWidth;
h = targetHeight;
}
do {
if (higherQuality && w > targetWidth) {
w /= 2;
if (w < targetWidth) {
w = targetWidth;
}
}
if (higherQuality && h > targetHeight) {
h /= 2;
if (h < targetHeight) {
h = targetHeight;
}
}
BufferedImage tmp = isIndexColorModel ?
new BufferedImage(w, h, type, (IndexColorModel)img.getColorModel()) :
new BufferedImage(w, h, type);
Graphics2D g2 = tmp.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(ret, 0, 0, w, h, null);
g2.dispose();
ret = tmp;
} while (w != targetWidth || h != targetHeight);
return ret;
}
}