3 import java.awt.Dimension;
4 import java.awt.Graphics;
5 import java.awt.Graphics2D;
7 import java.awt.image.BufferedImage;
8 import java.awt.image.ConvolveOp;
9 import java.awt.image.Kernel;
11 import javax.swing.ImageIcon;
14 * Class for providing generic image processing functions
16 public abstract class ImageUtils
18 private static final float SMOOTH_FACTOR = 0.008f;
19 private static ConvolveOp CONVOLVER = null;
21 /** Static block for initialization */
24 float[] smoothMatrix = {
26 SMOOTH_FACTOR, 1-(SMOOTH_FACTOR*4), SMOOTH_FACTOR,
29 CONVOLVER = new ConvolveOp(new Kernel(3, 3, smoothMatrix));
34 * Create a scaled and smoothed image according to the specified size
35 * @param inImage image to scale
36 * @param inWidth width to scale to
37 * @param inHeight height to scale to
38 * @return BufferedImage containing scaled result
40 public static BufferedImage createScaledImage(Image inImage, int inWidth, int inHeight)
42 // create smaller image and force its loading
43 Image smallerImage = inImage.getScaledInstance(inWidth, inHeight, Image.SCALE_SMOOTH);
44 Image tempImage = new ImageIcon(smallerImage).getImage();
45 tempImage.getWidth(null);
47 // create buffered image to do transform
48 BufferedImage buffer = new BufferedImage(inWidth, inHeight, BufferedImage.TYPE_INT_RGB);
49 // copy scaled picture into buffer
50 Graphics buffG = buffer.getGraphics();
51 buffG.drawImage(smallerImage, 0, 0, inWidth, inHeight, null);
55 smallerImage = null; tempImage = null;
56 // smooth scaled image using a normalized 3x3 matrix - taking next neighbour
57 buffer = CONVOLVER.filter(buffer, null);
64 * Work out the max size of a thumbnail
65 * @param inOrigWidth width of original picture
66 * @param inOrigHeight height of original picture
67 * @param inMaxWidth max width of thumbnail
68 * @param inMaxHeight max height of thumbnail
69 * @return size of thumbnail as Dimension
71 public static Dimension getThumbnailSize(int inOrigWidth, int inOrigHeight, int inMaxWidth, int inMaxHeight)
73 if (inMaxWidth <= 0 || inMaxHeight <= 0) {return new Dimension(1, 1);}
74 // work out maximum zoom ratio available so that thumbnail isn't too big
75 double xZoom = inMaxWidth * 1.0 / inOrigWidth;
76 double yZoom = inMaxHeight * 1.0 / inOrigHeight;
77 double zoom = (xZoom > yZoom?yZoom:xZoom);
78 // Don't make thumbnail bigger than picture
79 if (zoom > 1.0) {return new Dimension(inOrigWidth, inOrigHeight);}
81 // calculate new width and height
82 final int xSize = (int) (zoom * inOrigWidth);
83 final int ySize = (int) (zoom * inOrigHeight);
84 if (xSize <= 0 || ySize <= 0) {return new Dimension(1, 1);}
85 return new Dimension (xSize, ySize);
90 * Create a new image by rotating and scaling the given one
91 * @param inImage input image
92 * @param inMaxWidth maximum width of output image
93 * @param inMaxHeight maximum height of output image
94 * @param inRotationDegrees number of degrees to rotate clockwise (0, 90, 180 or 270)
95 * @return rotated, scaled image
97 public static BufferedImage rotateImage(Image inImage, int inMaxWidth, int inMaxHeight, int inRotationDegrees)
99 // Create scaled image of suitable size
100 boolean isRotated = (inRotationDegrees % 180 != 0);
101 int origWidth = inImage.getWidth(null);
102 int origHeight = inImage.getHeight(null);
103 int thumbWidth = isRotated?origHeight:origWidth;
104 int thumbHeight = isRotated?origWidth:origHeight;
105 Dimension scaledSize = getThumbnailSize(thumbWidth, thumbHeight, inMaxWidth, inMaxHeight);
106 BufferedImage result = new BufferedImage(scaledSize.width, scaledSize.height, BufferedImage.TYPE_INT_RGB);
107 // Do different things according to rotation angle (a bit messy, sorry!)
108 if (inRotationDegrees == 0)
110 // Not rotated, so just copy image directly
111 result.getGraphics().drawImage(inImage, 0, 0, scaledSize.width, scaledSize.height, null);
115 // Need to use Graphics2D for rotation, not Graphics
116 Graphics2D g2d = result.createGraphics();
117 switch (inRotationDegrees)
120 g2d.rotate(Math.PI / 2, 0.0, 0.0);
121 g2d.drawImage(inImage, 0, -scaledSize.width, scaledSize.height, scaledSize.width, null);
124 g2d.rotate(Math.PI, scaledSize.width/2.0, scaledSize.height/2.0);
125 g2d.drawImage(inImage, 0, 0, scaledSize.width, scaledSize.height, null);
128 g2d.rotate(Math.PI * 3/2, 0.0, 0.0);
129 g2d.drawImage(inImage, -scaledSize.height, 0, scaledSize.height, scaledSize.width, null);