package edu.mbl.jif.imaging.tiff;
/**
* File Name: tiffwrite.java
*
* Description: store 2D array of double or integer values
* to a TIFF file
*
* @author Liya Thomas
* @Date November, 2001
* @version
*/
// Java packages
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.lang.Math.*;
// class tiffwrite
public class TiffWrite_Liya {
public static final short MAXROWS = 3000; // maximum # of rows
public static final short MAXCOLUMNS = 1400; // maximum # of columns
private FileOutputStream fileOut; // output data stream pointer
private DataOutputStream dataOut; // output file stream pointer
// class constructor
public TiffWrite_Liya() { }
// initialize variables
// Convert a file name from "*.txt" to "*.tif"
String CreateTiffFileName(String fileName) {
StringBuffer tbuf;
String tempname;
tbuf = new StringBuffer(" ");
tbuf.setLength(0);
tbuf.append(fileName.substring(0,(fileName.length() - 2)));
tbuf.append("if");
return tbuf.toString();
}
// Create TIFF image of integer array
void WriteIntValues(int rows, int columns, int inputImageInt[][],
String outputFileName) {
if (rows<0 || rows>MAXROWS || columns<0 || columns>MAXCOLUMNS)
//errorMessage.PrintErrorMessage("Invalid # rows and # columns!");
System.out.println("Begin to write "+outputFileName+"...");
// offset to the end of data (gray values) in file
int pos = 8 + rows*columns;
System.out.println("pos = "+pos);
try {
fileOut = new FileOutputStream(outputFileName);
dataOut = new DataOutputStream(fileOut);
/*
* Write the header
*/
short i, j;
i = (short) 'I';
j = (short) (i * 256 + i);
fputword(j);
fputword((short)42);
fputlong(pos);
/*
* Write the bitmap
*/
for (i=0; i < rows; i++)
for (j=0; j < columns; j++)
dataOut.writeByte((byte)inputImageInt[i][j]);
System.out.println("Image bits wrote");
/*
* Write the tags
*/
fputword((short)8); // # of tags
writetiftag(SubFileType, TIFFshort, 1, 1);
writetiftag(ImageWidth, TIFFshort, 1, columns);
writetiftag(ImageLength, TIFFshort, 1, rows);
writetiftag(BitsPerSample, TIFFshort, 1, 8);
writetiftag(Compression, TIFFshort, 1, 1);
writetiftag(PhotoMetricInterp, TIFFshort, 1, 1); // for gray values only
writetiftag(StripOffsets, TIFFlong, 1, 8); // beginning of image data
writetiftag(PlanarConfiguration, TIFFshort, 1, 1);
System.out.println("Tags Wrote");
fputlong(0);
fileOut.close();
} catch (java.io.IOException read) {
System.out.println("Error occured while writing output file."); }
System.out.println("File "+outputFileName+ " output successful!");
}
/*
* write one TIFF tag to the IFD
*/
void writetiftag(short tag, short type, int length, int offset)
{
fputword(tag);
fputword(type);
fputlong(length);
fputlong(offset);
} /* writetiftag */
/*
* function: fputword
*/
void fputword(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
*/
void fputlong(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 */
// Create TIFF image of double-valued array
void WriteDoubleValues(int rows, int columns, double inputImageDouble[][],
String outputFileName) {
if (rows<0 || rows>MAXROWS || columns<0 || columns>MAXCOLUMNS)
//errorMessage.PrintErrorMessage("Invalid # rows and # columns!");
System.out.println("Begin to write "+outputFileName+"...");
// offset to the end of data (gray values) in file
int pos = 8 + rows*columns;
System.out.println("pos = "+pos);
try {
fileOut = new FileOutputStream(outputFileName);
dataOut = new DataOutputStream(fileOut);
/*
* Write the header
*/
short i, j;
i = (short) 'I';
j = (short) (i * 256 + i);
fputword(j);
fputword((short)42);
fputlong(pos);
/*
* Write the bitmap
*/
for (i=0; i < rows; i++)
for (j=0; j < columns; j++)
dataOut.writeByte((byte)((int)inputImageDouble[i][j]));
System.out.println("Image bits wrote");
/*
* Write the tags
*/
fputword((short)8); // # of tags
writetiftag(SubFileType, TIFFshort, 1, 1);
writetiftag(ImageWidth, TIFFshort, 1, columns);
writetiftag(ImageLength, TIFFshort, 1, rows);
writetiftag(BitsPerSample, TIFFshort, 1, 8);
writetiftag(Compression, TIFFshort, 1, 1);
writetiftag(PhotoMetricInterp, TIFFshort, 1, 1); // for gray values only
writetiftag(StripOffsets, TIFFlong, 1, 8); // beginning of image data
writetiftag(PlanarConfiguration, TIFFshort, 1, 1);
System.out.println("Tags Wrote");
fputlong(0);
fileOut.close();
} catch (java.io.IOException read) {
System.out.println("Error occured while writing output file."); }
System.out.println("File "+outputFileName+ " output successful!");
}
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;
}