package uk.co.mmscomputing.imageio.ppm; import java.io.IOException; import java.nio.ByteOrder; 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.*; import uk.co.mmscomputing.image.operators.*; public class PGMImageWriter extends ImageWriter implements PPMConstants{ protected PGMImageWriter(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 pgm(ImageOutputStream out, BufferedImage image)throws IOException{ int width = image.getWidth(); int height = image.getHeight(); PixelGrabber grabber = new PixelGrabber(image, 0, 0, width, height, false); try{ grabber.grabPixels(); }catch(InterruptedException e){ throw new IOException(getClass().getName()+".pgm: couldn't grab pixels from image !"); } String header="P5\n"+width+" "+height+"\n255\n"; out.write(header.getBytes()); WritableRaster raster=image.getRaster(); int k=0; byte[] bitmap = new byte[width*height]; for(int y=0;y<height;y++){ for(int x=0;x<width;x++){ bitmap[k++]=(byte)raster.getSample(x,y,0); } } 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(); if(image.getType()!=BufferedImage.TYPE_BYTE_GRAY){ image=new GrayScale().filter(image); } pgm(out,image); } public ImageWriteParam getDefaultWriteParam(){ return new ImageWriteParam(getLocale()); } }