001    // Copyright (c) 2001 Hursh Jain (http://www.mollypages.org) 
002    // The Molly framework is freely distributable under the terms of an
003    // MIT-style license. For details, see the molly pages web site at:
004    // http://www.mollypages.org/. Use, modify, have fun !
005    
006    package fc.util;
007    
008    import java.io.*;
009    import java.util.*;
010    import fc.io.*;
011    import fc.util.*;
012    
013    import java.awt.*;
014    import java.awt.geom.*;
015    import java.awt.image.*;
016    import javax.imageio.*;
017    
018    /* Misc. image related utils */
019    public final class ImageUtil
020    {
021    
022    /**
023    Resizes the specified image file to the new width and height and writes it to
024    the targetFile (creating the targetFile if it does not already exist).
025    <p>
026    The format string is the output format of the file, like "jpg", "gif" etc. This
027    can be different than the format of the source file. The understood formats
028    are those understood {@link javax.io.ImageWriter} (the usual suspects like gif,
029    jpg, png, etc, all seem to work).
030    */
031    public static void resize(File sourceFile, File targetFile, String format, int newWidth, int newHeight)
032    throws IOException  
033      {
034      BufferedImage resized = resize(sourceFile, newWidth, newHeight);
035      ImageIO.write(resized, format, targetFile);
036      }
037    
038    
039    /**
040    Resizes the specified image file to the new width and height and writes it to
041    the targetFile (creating the targetFile if it does not already exist).
042    <p>
043    The output format is the same as the input format and is intuited from the file
044    name extension of the specified source file (therefore, source files specified
045    to this method, should be like <code>foo.gif</code>, <code>foo.jpg</code>, etc).
046    */
047    public static void resize(File sourceFile, File targetFile, int newWidth, int newHeight)
048    throws IOException  
049      {
050      String name = sourceFile.getName();  
051      int pos = name.lastIndexOf(".");
052        if (pos == -1) {
053          throw new IOException("The specified source file: [" + sourceFile.getAbsolutePath() + "] has no extension, and this method needs an extension (like .gif, .jpg etc)");
054          }
055      String extension = name.substring(pos+1, name.length()); 
056      //System.out.println(extension);
057      resize(sourceFile, targetFile, extension, newWidth, newHeight);
058      }
059    
060    /**
061    Resizes the specified image file to the new width and height and returns the
062    new image.
063    */
064    public static BufferedImage resize(File sourceFile, int newWidth, int newHeight)
065    throws IOException  
066      {
067      BufferedImage sourceImage = ImageIO.read(sourceFile);
068      //WritableRaster raster = image.getRaster(); //for pixel manipulation, not needed
069    
070        int srcWidth = sourceImage.getWidth();
071        int srcHeight = sourceImage.getHeight();
072        
073        BufferedImage targetImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
074      Graphics2D g2 = targetImage.createGraphics();
075      AffineTransform transform = AffineTransform.getScaleInstance((double)newWidth/srcWidth, (double)newHeight/srcHeight);
076    
077      g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
078                RenderingHints.VALUE_INTERPOLATION_BICUBIC);
079                
080      g2.drawImage(sourceImage, transform, null);
081      g2.dispose(); 
082    
083      return targetImage;
084      }
085    
086    public static void main (String args[]) throws IOException  
087      {
088      Args myargs = new Args(args);
089      myargs.setUsage(myargs.getMainClassName() + " -source path-to-source-image -target path-to-write-target-img -width new-width -height new-height");
090      
091      File source = new File(myargs.getRequired("source"));
092      File target = new File(myargs.getRequired("target"));
093      int width = myargs.getRequiredInt("width");
094      int height = myargs.getRequiredInt("height");
095      
096      if (! source.exists()) {
097        System.out.println("Cannot read source file: " + source.getAbsolutePath());
098        System.exit(1);
099        }
100    
101      resize(source, target, width, height);  
102      }
103    }