Changeset 2804


Ignore:
Timestamp:
05/23/07 08:33:24 (13 years ago)
Author:
melissa
Message:

Eliminated dependency on ImageJ; updated what's new for next release.

Location:
trunk/loci/formats
Files:
1 deleted
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/in/FitsReader.java

    r2595 r2804  
    2525package loci.formats.in; 
    2626 
     27import java.awt.image.BufferedImage; 
     28import java.io.IOException; 
     29import loci.formats.*; 
     30 
    2731/** 
    2832 * FitsReader is the file format reader for 
    2933 * Flexible Image Transport System (FITS) images. 
    3034 * 
    31  * @author Curtis Rueden ctrueden at wisc.edu 
     35 * Much of this code was adapted from ImageJ (http://rsb.info.nih.gov/ij).  
    3236 */ 
    33 public class FitsReader extends ImageJReader { 
     37public class FitsReader extends FormatReader { 
     38 
     39  // -- Fields -- 
     40 
     41  /** Number of lines in the header. */ 
     42  private int count; 
    3443 
    3544  // -- Constructor -- 
     
    3847  public FitsReader() { super("Flexible Image Transport System", "fits"); } 
    3948 
     49  // -- IFormatReader API methods -- 
     50 
     51  /* @see loci.formats.IFormatReader#isThisType(byte[]) */ 
     52  public boolean isThisType(byte[] block) {  
     53    return true; 
     54  } 
     55 
     56  /* @see loci.formats.IFormatReader#openBytes(int) */ 
     57  public byte[] openBytes(int no) throws FormatException, IOException { 
     58    FormatTools.assertId(currentId, true, 1); 
     59    byte[] buf = new byte[core.sizeX[0] * core.sizeY[0] *  
     60      FormatTools.getBytesPerPixel(core.pixelType[0])]; 
     61    return openBytes(no, buf);  
     62  } 
     63 
     64  /* @see loci.formats.IFormatReader#openBytes(int, byte[]) */ 
     65  public byte[] openBytes(int no, byte[] buf) 
     66    throws FormatException, IOException 
     67  { 
     68    FormatTools.assertId(currentId, true, 1); 
     69    if (no < 0 || no >= getImageCount()) { 
     70      throw new FormatException("Invalid image number: " + no); 
     71    } 
     72    if (buf.length < core.sizeX[0] * core.sizeY[0] *  
     73      FormatTools.getBytesPerPixel(core.pixelType[0]))  
     74    { 
     75      throw new FormatException("Buffer too small."); 
     76    } 
     77 
     78    in.seek(2880 + 2880 * (((count * 80) - 1) / 2880)); 
     79    in.read(buf); 
     80    return buf; 
     81  } 
     82 
     83  /* @see loci.formats.IFormatReader#openImage(int) */ 
     84  public BufferedImage openImage(int no) throws FormatException, IOException { 
     85    return ImageTools.makeImage(openBytes(no), core.sizeX[0], core.sizeY[0], 
     86      core.sizeC[0], core.interleaved[0],  
     87      FormatTools.getBytesPerPixel(core.pixelType[0]), core.littleEndian[0]); 
     88  } 
     89 
     90  // -- Internal FormatReader API methods -- 
     91 
     92  /* @see loci.formats.FormatReader#initFile(String) */ 
     93  protected void initFile(String id) throws FormatException, IOException { 
     94    super.initFile(id); 
     95    in = new RandomAccessStream(id); 
     96    count = 1; 
     97 
     98    byte[] b = new byte[80]; 
     99    in.read(b); 
     100    String line = new String(b); 
     101    if (!line.startsWith("SIMPLE")) { 
     102      throw new FormatException("Unsupported FITS file."); 
     103    } 
     104   
     105    while (true) { 
     106      count++; 
     107      in.read(b); 
     108      line = new String(b); 
     109     
     110      // parse key/value pair  
     111      int ndx = line.indexOf("="); 
     112      int comment = line.indexOf("/", ndx); 
     113      if (comment < 0) comment = line.length(); 
     114 
     115      String key = "", value = ""; 
     116 
     117      if (ndx >= 0) { 
     118        key = line.substring(0, ndx).trim(); 
     119        value = line.substring(ndx + 1, comment).trim(); 
     120      } 
     121      else key = line.trim(); 
     122       
     123      if (key.equals("END")) break; 
     124 
     125      if (key.equals("BITPIX")) { 
     126        int bits = Integer.parseInt(value); 
     127        switch (bits) { 
     128          case 8: core.pixelType[0] = FormatTools.UINT8; break; 
     129          case 16: core.pixelType[0] = FormatTools.UINT16; break; 
     130          case 32: core.pixelType[0] = FormatTools.UINT32; break; 
     131          case -32: core.pixelType[0] = FormatTools.FLOAT; break; 
     132          default: throw new FormatException("Unsupported pixel type: " + bits); 
     133        } 
     134      } 
     135      else if (key.equals("NAXIS1")) core.sizeX[0] = Integer.parseInt(value);  
     136      else if (key.equals("NAXIS2")) core.sizeY[0] = Integer.parseInt(value);  
     137      else if (key.equals("NAXIS3")) core.sizeZ[0] = Integer.parseInt(value);  
     138 
     139      addMeta(key, value);  
     140    } 
     141   
     142    core.sizeC[0] = 1;   
     143    core.sizeT[0] = 1;   
     144    if (core.sizeZ[0] == 0) core.sizeZ[0] = 1; 
     145    core.imageCount[0] = core.sizeZ[0]; 
     146    core.rgb[0] = false; 
     147    core.littleEndian[0] = false; 
     148    core.interleaved[0] = false; 
     149    core.currentOrder[0] = "XYZCT"; 
     150   
     151    MetadataStore store = getMetadataStore(); 
     152    store.setPixels(new Integer(core.sizeX[0]), new Integer(core.sizeY[0]), 
     153      new Integer(core.sizeZ[0]), new Integer(core.sizeC[0]), 
     154      new Integer(core.sizeT[0]), new Integer(core.pixelType[0]), 
     155      new Boolean(!core.littleEndian[0]), core.currentOrder[0], null, null); 
     156  } 
     157 
    40158} 
  • trunk/loci/formats/in/PGMReader.java

    r2595 r2804  
    2525package loci.formats.in; 
    2626 
     27import java.awt.image.BufferedImage; 
     28import java.io.IOException; 
     29import java.util.StringTokenizer; 
     30import loci.formats.*; 
     31 
    2732/** 
    2833 * PGMReader is the file format reader for 
    2934 * Portable Gray Map (PGM) images. 
    3035 * 
    31  * @author Curtis Rueden ctrueden at wisc.edu 
     36 * Much of this code was adapted from ImageJ (http://rsb.info.nih.gov/ij).  
    3237 */ 
    33 public class PGMReader extends ImageJReader { 
     38public class PGMReader extends FormatReader { 
     39 
     40  // -- Fields -- 
     41 
     42  private boolean rawBits; 
     43  
     44  /** Offset to pixel data. */ 
     45  private long offset; 
    3446 
    3547  // -- Constructor -- 
     
    3850  public PGMReader() { super("Portable Gray Map", "pgm"); } 
    3951 
     52  // -- IFormatReader API methods --  
     53 
     54  /* @see loci.formats.IFormatReader#isThisType(byte[]) */ 
     55  public boolean isThisType(byte[] block) { 
     56    return block[0] == 'P'; 
     57  } 
     58 
     59  /* @see loci.formats.IFormatReader#openBytes(int) */ 
     60  public byte[] openBytes(int no) throws FormatException, IOException { 
     61    FormatTools.assertId(currentId, true, 1); 
     62    byte[] buf = new byte[core.sizeX[0] * core.sizeY[0] * core.sizeC[0] * 
     63      FormatTools.getBytesPerPixel(core.pixelType[0])];  
     64    return openBytes(no, buf);  
     65  } 
     66 
     67  /* @see loci.formats.IFormatReader#openBytes(int, byte[]) */ 
     68  public byte[] openBytes(int no, byte[] buf) 
     69    throws FormatException, IOException 
     70  { 
     71    FormatTools.assertId(currentId, true, 1); 
     72    if (no < 0 || no >= getImageCount()) { 
     73      throw new FormatException("Invalid image number: " + no); 
     74    } 
     75    if (buf.length < core.sizeX[0] * core.sizeY[0] * core.sizeC[0] * 
     76      FormatTools.getBytesPerPixel(core.pixelType[0])) 
     77    { 
     78      throw new FormatException("Buffer too small."); 
     79    } 
     80     
     81    in.seek(offset);  
     82    if (rawBits) in.read(buf); 
     83    else { 
     84      int pt = 0;  
     85      while (pt < buf.length) { 
     86        String line = in.readLine().trim(); 
     87        line = line.replaceAll("[^0-9]", " "); 
     88        StringTokenizer t = new StringTokenizer(line, " "); 
     89        while (t.hasMoreTokens()) { 
     90          int q = Integer.parseInt(t.nextToken().trim());  
     91          if (core.pixelType[0] == FormatTools.UINT16) { 
     92            short s = (short) q; 
     93            buf[pt] = (byte) ((s & 0xff00) >> 8); 
     94            buf[pt + 1] = (byte) (s & 0xff); 
     95            pt += 2; 
     96          } 
     97          else { 
     98            buf[pt] = (byte) q; 
     99            pt++; 
     100          } 
     101        } 
     102      }  
     103    } 
     104 
     105    return buf; 
     106  } 
     107 
     108  /* @see loci.formats.IFormatReader#openImage(int) */ 
     109  public BufferedImage openImage(int no) throws FormatException, IOException { 
     110    return ImageTools.makeImage(openBytes(no), core.sizeX[0], core.sizeY[0], 
     111      core.sizeC[0], core.interleaved[0],  
     112      FormatTools.getBytesPerPixel(core.pixelType[0]), core.littleEndian[0]); 
     113  } 
     114 
     115  // -- Internal FormatReader API methods -- 
     116 
     117  /* @see loci.formats.FormatReader#initFile(String) */ 
     118  protected void initFile(String id) throws FormatException, IOException { 
     119    super.initFile(id); 
     120    in = new RandomAccessStream(id); 
     121   
     122    String magic = in.readLine().trim(); 
     123 
     124    boolean isBlackAndWhite = false; 
     125 
     126    if (magic.equals("P1") || magic.equals("P2")) { 
     127      rawBits = false;  
     128      core.sizeC[0] = 1;  
     129      isBlackAndWhite = magic.equals("P1");  
     130    }  
     131    else if (magic.equals("P3")) { 
     132      rawBits = false; 
     133      core.sizeC[0] = 3; 
     134    } 
     135    else if (magic.equals("P4") || magic.equals("P5")) { 
     136      rawBits = true; 
     137      core.sizeC[0] = 1; 
     138      isBlackAndWhite = magic.equals("P4");  
     139    } 
     140    else if (magic.equals("P6")) { 
     141      rawBits = true; 
     142      core.sizeC[0] = 3; 
     143    } 
     144    else throw new FormatException("Unsupported magic number: " + magic);  
     145  
     146    String line = in.readLine().trim(); 
     147    while (line.startsWith("#") || line.length() == 0) line = in.readLine(); 
     148   
     149    line = line.replaceAll("[^0-9]", " "); 
     150    core.sizeX[0] =  
     151      Integer.parseInt(line.substring(0, line.indexOf(" ")).trim()); 
     152    core.sizeY[0] =  
     153      Integer.parseInt(line.substring(line.indexOf(" ") + 1).trim()); 
     154   
     155    if (!isBlackAndWhite) { 
     156      int max = Integer.parseInt(in.readLine().trim()); 
     157      if (max > 255) core.pixelType[0] = FormatTools.UINT16; 
     158      else core.pixelType[0] = FormatTools.UINT8; 
     159    } 
     160   
     161    offset = in.getFilePointer();  
     162     
     163    core.rgb[0] = core.sizeC[0] == 3; 
     164    core.currentOrder[0] = "XYCZT"; 
     165    core.littleEndian[0] = true; 
     166    core.interleaved[0] = false; 
     167    core.sizeZ[0] = 1;  
     168    core.sizeT[0] = 1;  
     169    core.imageCount[0] = 1;  
     170   
     171    MetadataStore store = getMetadataStore(); 
     172    store.setPixels(new Integer(core.sizeX[0]), new Integer(core.sizeY[0]), 
     173      new Integer(core.sizeZ[0]), new Integer(core.sizeC[0]), 
     174      new Integer(core.sizeT[0]), new Integer(core.pixelType[0]), 
     175      new Boolean(!core.littleEndian[0]), core.currentOrder[0], null, null); 
     176  } 
     177 
    40178} 
  • trunk/loci/formats/readers.txt

    r2755 r2804  
    2929loci.formats.in.JPEGReader         # jpg, jpeg [javax.imageio] 
    3030 
    31 # ImageJ readers 
    32 loci.formats.in.PGMReader          # pgm [ImageJ] 
    33 loci.formats.in.FitsReader         # fits [ImageJ] 
    34  
    3531# standalone readers with unique file extensions 
     32loci.formats.in.PGMReader          # pgm 
     33loci.formats.in.FitsReader         # fits 
    3634loci.formats.in.GIFReader          # gif 
    3735loci.formats.in.BMPReader          # bmp 
  • trunk/loci/formats/whats-new.txt

    r2728 r2804  
     1* Better Slidebook support 
     2* Added support for Quicktime RPZA 
     3* Better Leica LIF metadata parsing 
     4* Added support for BioRad PIC companion files 
     5* Added support for bzip2-compressed files 
     6* Improved ImageJ plugins 
     7* Native support for FITS and PGM 
     8 
    192007 May 2: 
    210* Added support for NRRD 
Note: See TracChangeset for help on using the changeset viewer.