package uk.co.mmscomputing.imageio.jpeg;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.imageio.spi.*;
import javax.imageio.stream.*;
import javax.imageio.metadata.*;
public class JPEGImageWriter extends ImageWriter{
protected JPEGImageWriter(ImageWriterSpi originatingProvider){
super(originatingProvider);
}
public IIOMetadata convertImageMetadata(IIOMetadata inData, ImageTypeSpecifier imageType, ImageWriteParam param){
return null;
}
public IIOMetadata convertStreamMetadata(IIOMetadata inData,ImageWriteParam param){
return null;
}
public IIOMetadata getDefaultImageMetadata(ImageTypeSpecifier imageType,ImageWriteParam param){
return null;
}
public IIOMetadata getDefaultStreamMetadata(ImageWriteParam param){
return null;
}
public ImageWriteParam getDefaultWriteParam(){
return new ImageWriteParam(getLocale());
}
public boolean canInsertImage(int imageIndex)throws IOException{
return (imageIndex==0);
}
public void write(IIOMetadata streamMetadata,IIOImage img,ImageWriteParam param)throws IOException{
ImageOutputStream out=(ImageOutputStream)getOutput();
if(!(img.getRenderedImage() instanceof BufferedImage)){
throw new IOException(getClass().getName()+"write:\nCan only write BufferedImage objects");
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
write(baos,(BufferedImage)img.getRenderedImage());
out.write(baos.toByteArray()); // write to image stream
}
static public void write(OutputStream out, BufferedImage image)throws IOException{
int width = image.getWidth();
int height = image.getHeight();
JFIFOutputStream os = null;
try{
System.out.println("3\b"+JPEGImageWriter.class.getName()+"\n\tMMSC-JPEG Encoder: type = "+image.getType());
switch(image.getType()){
case BufferedImage.TYPE_INT_RGB: os = new RGBJFIFOutputStream(out,height,width); break; // 1
case BufferedImage.TYPE_INT_BGR: // 4
case BufferedImage.TYPE_3BYTE_BGR: os = new BGRJFIFOutputStream(out,height,width); break; // 5
case BufferedImage.TYPE_BYTE_GRAY: os = new GreyJFIFOutputStream(out,height,width); break; // 10
case BufferedImage.TYPE_BYTE_INDEXED:
// os = new IndexedJFIFOutputStream(out,height,width); break; // 13
default: // three components; YCbCr
os = new RGBJFIFOutputStream(out,height,width);
for(int y=0;y<height;y++){
for(int x=0;x<width;x++){
os.writeInt(image.getRGB(x,y));
}
}
os.close();
return;
}
os.write(image);
}catch(Exception e){
e.printStackTrace();
throw new IOException("3\b"+JPEGImageWriter.class.getName()+".write:\n\tCould not write image due to :\n\t"+e.getMessage());
}finally{
if(os!=null){os.close();} // EOF: end of frame
}
}
}