/* @(#) MultipleImageFactory.java 1.1 2002/31/3
 * Copyright (c) 2002 Lawrence Rodrigues
 */
import java.io.*;
import java.util.*;
import java.beans.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.image.renderable.*;

import javax.media.jai.*;
import com.sun.media.jai.codec.*;

/** A utility class that cuts images into multiple subimages and saves them in the JPEG format.. 
  * To run this utility type: java MultipleImageFactory <imagefile> <tilewidth> <tile height>
  * @version 1.0  1 April 2002
  * @author Lawrence Rodrigues
  */
public class MultipleImageFactory {

  public static void  main(String[] args){
      MultipleImageFactory mfact = new MultipleImageFactory();
      int tileWidth =  256;
      int tileHeight = 256;
      if(args.length <1) {
         System.out.println("Enter a valid image file name");
         System.exit(0);
  
      }else{
        if(args.length >2) {
        try {
          tileWidth = Integer.parseInt(args[1]);
          tileHeight = Integer.parseInt(args[2]); 

        }catch(Exception e) {}
 
        }
      }
      PlanarImage img = MultipleImageFactory.readAsPlanarImage(args[0]);
      mfact.createTilesAndSave(img, tileWidth,tileHeight);
   }


   public void createTilesAndSave(PlanarImage image, int tileWidth, int tileHeight){
      if(image == null) return;
      int imageWidth = image.getWidth();
      int imageHeight = image.getHeight();
    
      PlanarImage rfmtImage = reformatImage(image, new Dimension(tileWidth, tileHeight));
      SampleModel sampleModel = rfmtImage.getSampleModel();
      ColorModel colorModel = rfmtImage.getColorModel();
      int numXTiles = rfmtImage.getNumXTiles();
      int numYTiles = rfmtImage.getNumYTiles();

     
      for(int j=0;j<numYTiles;j++){
        for (int i=0;i<numXTiles;i++){
             Raster tile = rfmtImage.getTile(i, j);
             DataBuffer dataBuffer = tile.getDataBuffer();
             WritableRaster wr = tile.createWritableRaster(sampleModel,
                                            dataBuffer, new Point(0,0));
             BufferedImage bi = new BufferedImage(colorModel,
                                            wr,
                                            colorModel.isAlphaPremultiplied(),
                                            null);
            
             try {
               saveAsJPEG(bi, new String("tile"+ (new Integer(j)).toString()+
                                               (new Integer(i)).toString()));
             } catch (Exception e) {
               e.printStackTrace();
             }
 
        }

     }
   }

   public static PlanarImage readAsPlanarImage(String filename) {
      return JAI.create("fileload", filename);
   }

   public static void saveAsJPEG(RenderedImage image, String file)
           throws java.io.IOException {
      String filename = file;
      if(!filename.endsWith(".jpg"))filename = new String(file+".jpg");
      OutputStream out = new FileOutputStream(filename);
      JPEGEncodeParam param = new JPEGEncodeParam();
      ImageEncoder encoder = ImageCodec.createImageEncoder("JPEG", out, param);
      encoder.encode(image);
      out.close();
   }

   public static RenderedOp reformatImage(PlanarImage img, Dimension tileDim) {
      ImageLayout tileLayout = new ImageLayout(img);
      tileLayout.setTileWidth(tileDim.width);
      tileLayout.setTileHeight(tileDim.width);

      HashMap map = new HashMap();
      map.put(JAI.KEY_IMAGE_LAYOUT, tileLayout);
      map.put(JAI.KEY_INTERPOLATION,
             Interpolation.getInstance(Interpolation.INTERP_BICUBIC));

      RenderingHints tileHints = new RenderingHints(map);
      ParameterBlock pb = new ParameterBlock();
      pb.addSource(img);
      return JAI.create("format", pb, tileHints);
   }
}
