package dr.util; /** * @author Marc A. Suchard * @author Liya Thomas -- most code taken from Liya's November 2001 free source code */ import java.io.DataOutputStream; public class TIFFWriter { public static final short MAXROWS = 6000; // maximum # of rows public static final short MAXCOLUMNS = 3000; // maximum # of columns // Create TIFF image of integer array public static void writeDoubleArray( DataOutputStream dataOut, double[][] inputImageInt) { final int rows = inputImageInt.length; final int columns = inputImageInt[0].length; if (rows < 0 || rows > MAXROWS || columns < 0 || columns > MAXCOLUMNS) throw new RuntimeException("Invalid # rows and # columns"); // offset to the end of data (gray values) in file int pos = 8 + rows * columns; try { /* * Write the header */ short i, j; i = (short) 'I'; j = (short) (i * 256 + i); fputword(dataOut, j); fputword(dataOut, (short) 42); fputlong(dataOut, pos); /* * Write the bitmap */ for (i = 0; i < rows; i++) for (j = 0; j < columns; j++) { int datum = (int) inputImageInt[i][j]; dataOut.writeByte((byte) datum); } /* * Write the tags */ fputword(dataOut, (short) 8); // # of tags writetiftag(dataOut, SubFileType, TIFFshort, 1, 1); writetiftag(dataOut, ImageWidth, TIFFshort, 1, columns); writetiftag(dataOut, ImageLength, TIFFshort, 1, rows); writetiftag(dataOut, BitsPerSample, TIFFshort, 1, 8); writetiftag(dataOut, Compression, TIFFshort, 1, 1); writetiftag(dataOut, PhotoMetricInterp, TIFFshort, 1, 1); // for gray values only writetiftag(dataOut, StripOffsets, TIFFlong, 1, 8); // beginning of image data writetiftag(dataOut, PlanarConfiguration, TIFFshort, 1, 1); fputlong(dataOut, 0); } catch (java.io.IOException read) { System.out.println("Error occured while writing output file."); } } /* * write one TIFF tag to the IFD */ static void writetiftag(DataOutputStream dataOut, short tag, short type, int length, int offset) { fputword(dataOut, tag); fputword(dataOut, type); fputlong(dataOut, length); fputlong(dataOut, offset); } /* writetiftag */ /* * function: fputword */ static void fputword(DataOutputStream dataOut, short n) { try { dataOut.writeByte((byte) n); dataOut.writeByte((byte) (n >> 8)); } catch (java.io.IOException read) { System.out.println("Error occured while writing output file."); } } /* fputword */ /* * function: fputlong */ static void fputlong(DataOutputStream dataOut, int n) { try { dataOut.writeByte((byte) n); dataOut.writeByte((byte) (n >> 8)); dataOut.writeByte((byte) (n >> 16)); dataOut.writeByte((byte) (n >> 24)); } catch (java.io.IOException read) { System.out.println("Error occured while writing output file."); } } /* fputlong */ public static final short GOOD_WRITE = 0; public static final short BAD_WRITE = 1; public static final short BAD_READ = 2; public static final short MEMORY_ERROR = 3; public static final short WRONG_BITS = 4; public static final short RGB_RED = 0; public static final short RGB_GREEN = 1; public static final short RGB_BLUE = 2; public static final short RGB_SIZE = 3; /* * TIFF object sizes */ public static final short TIFFbyte = 1; public static final short TIFFascii = 2; public static final short TIFFshort = 3; public static final short TIFFlong = 4; public static final short TIFFrational = 5; /* * TIFF tag names */ public static final short NewSubFile = 254; public static final short SubFileType = 255; public static final short ImageWidth = 256; public static final short ImageLength = 257; public static final short RowsPerStrip = 278; public static final short StripOffsets = 273; public static final short StripByteCounts = 279; public static final short SamplesPerPixel = 277; public static final short BitsPerSample = 258; public static final short Compression = 259; public static final short PlanarConfiguration = 284; public static final short Group3Options = 292; public static final short Group4Options = 293; public static final short FillOrder = 266; public static final short Threshholding = 263; public static final short CellWidth = 264; public static final short CellLength = 265; public static final short MinSampleValue = 280; public static final short MaxSampleValue = 281; public static final short PhotoMetricInterp = 262; public static final short GrayResponseUnit = 290; public static final short GrayResponseCurve = 291; public static final short ColorResponseUnit = 300; public static final short ColorResponseCurves = 301; public static final short XResolution = 282; public static final short YResolution = 283; public static final short ResolutionUnit = 296; public static final short Orientation = 274; public static final short DocumentName = 269; public static final short PageName = 285; public static final short XPosition = 286; public static final short YPosition = 287; public static final short PageNumber = 297; public static final short ImageDescription = 270; public static final short Make = 271; public static final short Model = 272; public static final short FreeOffsets = 288; public static final short FreeByteCounts = 289; public static final short ColorMap = 320; public static final short Artist = 315; public static final short DateTime = 306; public static final short HostComputer = 316; public static final short Software = 305; }