
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.WritableRaster;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.IOException;

/**
 * class ImageLoader
 * offesr static methods to load and test images files
 * @version 1.5 99/02/18
 * @since JDK 1.2
 */

public class ImageLoader  {
	
	public static final int TYPE_UNKNOWN=-1;
	public static final int TYPE_GIF=0;
	public static final int TYPE_JPEG=1;
	public static final int TYPE_RASTER=2;


	private ImageLoader() {		
	}

	public static Image getImage(String imagePath )
	{
		int type;
		Image img=null;
		try{
			type=getTypeImage(imagePath);
		}
		catch(FileNotFoundException fe){
			return null;
		}
		switch(type){
		case TYPE_GIF:
		case TYPE_JPEG:
			// Use a MediaTracker to fully load the image.
			img = Toolkit.getDefaultToolkit().getImage(imagePath);
			MediaTracker mt = new MediaTracker(new java.awt.Button());// very pretty!
			mt.addImage(img, 0);
			try { 
				mt.waitForID(0); 
			}
			catch (InterruptedException ie) {
				img=null; 
				break;
			}
			if (mt.isErrorID(0)) {
				img=null;
			}
			break;
		case TYPE_RASTER:
			try{
				RasImageDecoder decoder=new RasImageDecoder(imagePath);
				img=decoder.decodeAsBufferedImage();
			}
			catch(FileNotFoundException e){
				 return null;
			}
			break;
		default:
		}	
		return img;
	}
	
	public static BufferedImage getScaledImage(Image img,int width,int height)
	{
		BufferedImage bi;
		double ratiox=(double)width/(double)img.getWidth(null);
		double ratioy=(double)height/(double)img.getHeight(null);
		AffineTransform transfo=AffineTransform.getScaleInstance(ratiox,ratioy);

  		if(img instanceof BufferedImage){
			// Problem with BufferedImage issu of RasImageDecoder
			BufferedImage imgIn=(BufferedImage)img;
			AffineTransformOp op=new AffineTransformOp(transfo,AffineTransformOp.TYPE_BILINEAR);
			bi=op.filter(imgIn,null);
		}
		else{
			bi=new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
			Graphics2D g2 = bi.createGraphics();
			g2.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
			g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC);
			g2.drawImage(img, transfo, null);
		}
		return bi;
	}
	
	public static int getTypeImage(String imagePath) throws FileNotFoundException
	{
		return TYPE_RASTER;
	}


} // ImageLoader






