package uk.co.mmscomputing.imageio.ppm; import java.io.*; import java.util.*; import java.awt.image.*; import javax.imageio.*; import javax.imageio.spi.*; import javax.imageio.stream.*; import javax.imageio.metadata.*; public class PPMImageWriter extends ImageWriter{ protected PPMImageWriter(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 boolean canInsertImage(int imageIndex)throws IOException{ super.canInsertImage(imageIndex); return (imageIndex==0); // can deal only with one image } public void ppm(ImageOutputStream out, BufferedImage image)throws IOException{ int width = image.getWidth(); int height = image.getHeight(); int data[] = new int[width*height]; PixelGrabber grabber = new PixelGrabber(image, 0, 0, width, height, data, 0, width); try{ grabber.grabPixels(); }catch(InterruptedException e){ throw new IOException(getClass().getName()+".ppm: couldn't grab pixels from image !"); } String header="P6\n"+width+" "+height+"\n255\n"; out.write(header.getBytes()); ColorModel model = grabber.getColorModel(); int k=0; int col; byte[] bitmap = new byte[width*height*3]; for(int y=0;y<height;y++){ for(int x=0;x<width;x++){ col=data[y*width+x]; bitmap[k++]=(byte)model.getRed(col); bitmap[k++]=(byte)model.getGreen(col); bitmap[k++]=(byte)model.getBlue(col); } } out.write(bitmap); } 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: Can only write BufferedImage objects"); } BufferedImage image=(BufferedImage)img.getRenderedImage(); ppm(out,image); } public ImageWriteParam getDefaultWriteParam(){ return new ImageWriteParam(getLocale()); } }