|
FITS_Writer |
|
package ij.plugin; import ij.*; import ij.io.*; import ij.process.*; import java.io.*; /** This plugin saves a 16 or 32 bit image in FITS format. It is a stripped-down version of the SaveAs_FITS plugin from the collection of astronomical image processing plugins by Jennifer West at http://www.umanitoba.ca/faculties/science/astronomy/jwest/plugins.html */ public class FITS_Writer implements PlugIn { public void run(String path) { ImagePlus imp = IJ.getImage(); ImageProcessor ip = imp.getProcessor(); int numImages = imp.getImageStackSize(); int bitDepth = imp.getBitDepth(); if (bitDepth==24) { IJ.error("RGB images are not supported"); return; } File f = new File(path); String directory = f.getParent()+File.separator; String name = f.getName(); if (f.exists()) f.delete(); int numBytes = 0; if (bitDepth==8) ip = ip.convertToShort(false); else if (imp.getCalibration().isSigned16Bit()) ip = ip.convertToFloat(); if (ip instanceof ShortProcessor) numBytes = 2; else if (ip instanceof FloatProcessor) numBytes = 4; int fillerLength = 2880 - ( (numBytes * imp.getWidth() * imp.getHeight()) % 2880 ); createHeader(path, ip, numBytes); writeData(path, ip); char[] endFiller = new char[fillerLength]; appendFile(endFiller, path); } void createHeader(String path, ImageProcessor ip, int numBytes) { int numCards = 5; String bitperpix = ""; if (numBytes==2) {bitperpix = " 16";} else if (numBytes==4) {bitperpix = " -32";} else if (numBytes==1) {bitperpix = " 8";} appendFile(writeCard("SIMPLE", " T", ""), path); appendFile(writeCard("BITPIX", bitperpix, ""), path); appendFile(writeCard("NAXIS", " 2", ""), path); appendFile(writeCard("NAXIS1", " "+ip.getWidth(), "image width"), path); appendFile(writeCard("NAXIS2", " "+ip.getHeight(), "image height"), path); int fillerSize = 2880 - ((numCards*80+3) % 2880); char[] end = new char[3]; end[0] = 'E'; end[1] = 'N'; end[2] = 'D'; char[] filler = new char[fillerSize]; for (int i = 0; i < fillerSize; i++) filler[i] = ' '; appendFile(end, path); appendFile(filler, path); } /** Writes one line of a FITS header */ char[] writeCard(String title, String value, String comment) { char[] card = new char[80]; for (int i = 0; i < 80; i++) card[i] = ' '; s2ch(title, card, 0); card[8] = '='; s2ch(value, card, 10); card[31] = '/'; s2ch(comment, card, 32); return card; } /** Converts a String to a char[] */ void s2ch (String str, char[] ch, int offset) { int j = 0; for (int i = offset; i < str.length()+offset; i++) ch[i] = str.charAt(j++); } /** Appends 'line' to the end of the file specified by 'path'. */ void appendFile(char[] line, String path) { try { FileWriter output = new FileWriter(path, true); output.write(line); output.close(); } catch (IOException e) { IJ.showStatus("Error writing file!"); return; } } /** Appends the data of the current image to the end of the file specified by path. */ void writeData(String path, ImageProcessor ip) { int w = ip.getWidth(); int h = ip.getHeight(); ip.flipVertical(); if (ip instanceof ShortProcessor) { short[] pixels = (short[])ip.getPixels(); try { DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path,true))); for (int i = 0; i < (pixels.length); i++) dos.writeShort(pixels[i]); dos.close(); } catch (IOException e) { IJ.write("Error writing file!"); return; } } else if (ip instanceof FloatProcessor) { float[] pixels = (float[])ip.getPixels(); try { DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path,true))); for (int i = 0; i < (pixels.length); i++) dos.writeFloat(pixels[i]); dos.close(); } catch (IOException e) { IJ.write("Error writing file!"); return; } } ip.flipVertical(); } }
|
FITS_Writer |
|