package uk.co.mmscomputing.imageio.jpeg;
import java.io.*;
import java.util.Iterator;
import java.util.ArrayList;
import java.awt.image.*;
import javax.imageio.*;
import javax.imageio.spi.*;
import javax.imageio.stream.*;
import javax.imageio.metadata.*;
public class JPEGImageReader extends ImageReader {
JFIFInputStream is=null;
BufferedImage image=null;
protected JPEGImageReader(ImageReaderSpi originatingProvider){
super(originatingProvider);
}
public BufferedImage read(int imageIndex, ImageReadParam param)throws IOException{
checkIndex(imageIndex);
if(image==null){image=read((ImageInputStream)getInput());}
return image;
}
public int getHeight(int imageIndex)throws IOException{
checkIndex(imageIndex);
if(image==null){image=read((ImageInputStream)getInput());}
return is.getHeight();
}
public int getWidth(int imageIndex)throws IOException{
checkIndex(imageIndex);
if(image==null){image=read((ImageInputStream)getInput());}
return is.getWidth();
}
public Iterator getImageTypes(int imageIndex)throws IOException{
checkIndex(imageIndex);
if(image==null){image=read((ImageInputStream)getInput());}
ImageTypeSpecifier imageType = null;
java.util.List l = new ArrayList();
switch(is.getNumComponents()){
case 1: imageType=ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_BYTE_GRAY); break;
case 3: imageType=ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB); break;
}
l.add(imageType);
return l.iterator();
}
public int getNumImages(boolean allowSearch)throws IOException{
return 1;
}
public IIOMetadata getImageMetadata(int imageIndex)throws IOException{
checkIndex(imageIndex);
return null;
}
public IIOMetadata getStreamMetadata() throws IOException{
return null;
}
private void checkIndex(int imageIndex) {
if (imageIndex != 0) {
throw new IndexOutOfBoundsException(getClass().getName()+".checkIndex: Bad index in jpeg image reader");
}
}
private BufferedImage read(ImageInputStream in)throws IOException{
if(in==null){throw new IllegalArgumentException(getClass().getName()+".read: ImageInputStream is null.");}
BufferedImage image=null;
try{
byte[] data;
int len = (int)in.length();
if(len==-1){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
data=new byte[16*1024];
while((len=in.read(data))!=-1){
baos.write(data,0,len);
}
data = baos.toByteArray();
}else if(len==0){
throw new IllegalArgumentException(getClass().getName()+".read: ImageInputStream has length zero.");
}else{
data = new byte[len];
in.readFully(data);
}
is=new JFIFInputStream(new ByteArrayInputStream(data));
int height=is.getHeight();
int width =is.getWidth();
int spp =is.getNumComponents();
if(spp==1){
image=new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster=image.getRaster();
DataBufferByte buffer=(DataBufferByte)raster.getDataBuffer();
byte[] imgdata=(byte[])buffer.getData();
is.read(imgdata);
}else{
image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
WritableRaster raster=image.getRaster();
DataBufferInt buffer=(DataBufferInt)raster.getDataBuffer();
int[] imgdata=(int[])buffer.getData();
is.read(imgdata);
}
}catch(Exception e){
System.out.println("9\b"+e.getMessage());
e.printStackTrace();
}
return image;
}
}