package uk.co.mmscomputing.imageio.tiff; import java.io.*; public class TIFFClassFMROutputStream extends TIFFClassFOutputStream{ // TIFF Class F; T.4 MR; byte aligned EOLs public TIFFClassFMROutputStream(OutputStream out)throws IOException{ super(out); } public void write(int cw)throws IOException{ // MR code 'bytes' if(lastByteWasZero&&((cw&0x00FF)==0x80)){ // 0x00,0x80 end of line code word height++; // end of line increase height } super.write(cw); } public void writePageEnd()throws IOException{ if(lastByteWasZero){buf.write(0);} int align=buf.size()&0x01; byte[] data=buf.toByteArray(); int ifdoffset=offset+data.length+align+16; // data.length+xres.size+yres.size writeInt(ifdoffset); // ptr to ifd; write data in front of ifd out.write(data); // write to image stream if(align>0){out.write(0);} // word alignment writeInt(xres); // xres -16 writeInt(1); writeInt(yres); // yres -8 writeInt(1); writeShort(12); // IFD +0: count directory entries // entries need to be in tag order ! writeShort(ImageWidth); // 256 +2 writeShort(LONG); writeInt(1); writeInt(width); writeShort(ImageLength); // 257 +14 writeShort(LONG); writeInt(1); writeInt(height); writeShort(Compression); // 259 +26 writeShort(SHORT); writeInt(1); writeInt(CCITTFAXT4); writeShort(PhotometricInterpretation); // 262 +38 writeShort(SHORT); writeInt(1); writeInt(WhiteIsZero); writeShort(FillOrder); // 266 +50 writeShort(SHORT); writeInt(1); writeInt(2); // 2 = Least Significant Bit first writeShort(StripOffsets); // 273 +62 writeShort(LONG); writeInt(1); // all data in one strip ! writeInt(offset); writeShort(RowsPerStrip); // 278 +74 writeShort(LONG); writeInt(1); writeInt(height); // all data in one strip ! writeShort(StripByteCounts); // 279 +86 writeShort(LONG); writeInt(1); writeInt(data.length); // all data in one strip ! writeShort(XResolution); // 282 +98 writeShort(RATIONAL); writeInt(1); writeInt(ifdoffset-16); // 203.0 writeShort(YResolution); // 283 +110 writeShort(RATIONAL); writeInt(1); writeInt(ifdoffset-8); // 196.0 writeShort(T4Options); // 292 +122 writeShort(LONG); writeInt(1); writeInt(5); // 292 MR; byte aligned EOLs writeShort(ResolutionUnit); // 296 +134 writeShort(SHORT); writeInt(1); writeInt(Inch); offset=ifdoffset+150; } }