views:

630

answers:

3
+2  Q: 

Java 2D and resize

I have some old Java 2D code I want to reuse, but was wondering, is this the best way to get the highest quality images?

    public static BufferedImage getScaled(BufferedImage imgSrc, Dimension dim) {

 // This code ensures that all the pixels in the image are loaded.
 Image scaled = imgSrc.getScaledInstance(
   dim.width, dim.height, Image.SCALE_SMOOTH);

 // This code ensures that all the pixels in the image are loaded.
 Image temp = new ImageIcon(scaled).getImage();

 // Create the buffered image.
 BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null), 
   temp.getHeight(null), BufferedImage.TYPE_INT_RGB);

 // Copy image to buffered image.
 Graphics g = bufferedImage.createGraphics();
 // Clear background and paint the image.
 g.setColor(Color.white);
 g.fillRect(0, 0, temp.getWidth(null),temp.getHeight(null));
 g.drawImage(temp, 0, 0, null);
 g.dispose();


 // j2d's image scaling quality is rather poor, especially when
 // scaling down an image to a much smaller size. We'll post filter  
 // our images using a trick found at 
 // http://blogs.cocoondev.org/mpo/archives/003584.html
 // to increase the perceived quality....
 float origArea = imgSrc.getWidth() * imgSrc.getHeight();
 float newArea = dim.width * dim.height;
 if (newArea <= (origArea / 2.)) {
  bufferedImage = blurImg(bufferedImage);
 }

 return bufferedImage;
}

public static BufferedImage blurImg(BufferedImage src) {
 // soften factor - increase to increase blur strength
 float softenFactor = 0.010f;
 // convolution kernel (blur)
 float[] softenArray = {
   0,     softenFactor,   0, 
   softenFactor, 1-(softenFactor*4), softenFactor, 
   0,     softenFactor,   0};

 Kernel kernel = new Kernel(3, 3, softenArray);
 ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
 return cOp.filter(src, null);
}
+2  A: 

You can use JAI (Java Advanced Imaging) to get more sophisticated image resizing options. See https://jai.dev.java.net/. These allow you much more flexibility than the java.awt.image package.

JeffFoster
+3  A: 

Chris Campbell has an excellent and detailed write-up on scaling images - see this article.

Chet Haase and Romain Guy also have a detailed and very informative write-up of image scaling in their book, Filthy Rich Clients.

David
really great articles. thanks!
Epaga
A: 

You could also look into java-image-scaling library.

Juha Syrjälä