Changeset 3886


Ignore:
Timestamp:
04/07/08 11:26:33 (12 years ago)
Author:
melissa
Message:

Added support for square root scaling.

Location:
trunk/loci/formats
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/TiffTools.java

    r3880 r3886  
    16251625    int index = 0; 
    16261626    int counter = 0; 
     1627    int numBytes = bitsPerSample[0] / 8; 
    16271628    for (int j=0; j<bytes.length; j++) { 
    1628       int numBytes = bitsPerSample[0] / 8; 
    16291629 
    16301630      if (bitsPerSample[0] % 8 != 0) { 
     
    16901690        } 
    16911691        index += numBytes; 
    1692         int ndx = startIndex + j; 
    1693         if (ndx >= numSamples) ndx = numSamples - 1; 
    1694         short v = (short) DataTools.bytesToLong(b, !littleEndian); 
     1692        long v = DataTools.bytesToLong(b, littleEndian); 
    16951693 
    16961694        if (photoInterp == WHITE_IS_ZERO) { // invert color value 
    16971695          long max = 1; 
    16981696          for (int q=0; q<numBytes; q++) max *= 8; 
    1699           v = (short) (max - v); 
     1697          v = max - v; 
    17001698        } 
    17011699        else if (photoInterp == CMYK) { 
    1702           v = (short) (Integer.MAX_VALUE - v); 
    1703         } 
    1704         DataTools.unpackShort(v, samples, 
    1705           channelNum*numSamples + ndx*numBytes, littleEndian); 
     1700          v = Integer.MAX_VALUE - v; 
     1701        } 
     1702        DataTools.unpackBytes(v, samples, 
     1703          channelNum*numSamples + j*numBytes, numBytes, littleEndian); 
    17061704      } 
    17071705    } 
     
    17421740      sampleCount -= trunc; 
    17431741    } 
    1744  
    1745     // rules on incrementing the index: 
    1746     // 1) if the planar configuration is set to 1 (interleaved), then add one 
    1747     //    to the index 
    1748     // 2) if the planar configuration is set to 2 (separated), then go to 
    1749     //    j + (i*(bytes.length / sampleCount)) 
    17501742 
    17511743    int bps0 = bitsPerSample[0]; 
     
    18361828        else if (bps8) { 
    18371829          // special case handles 8-bit data more quickly 
    1838           //if (planar == 2) { index = j+(i*(bytes.length / samples.length)); } 
    18391830 
    18401831          int ndx = startIndex + j; 
    18411832          if (photoInterp != Y_CB_CR) { 
    1842             short b = (short) (bytes[index++] & 0xff); 
    1843             samples[i*nSamples + ndx] = 
    1844               (byte) (b < 0 ? Integer.MAX_VALUE + b : b); 
     1833            samples[i*nSamples + ndx] = (byte) (bytes[index++] & 0xff); 
    18451834          } 
    18461835 
    18471836          if (photoInterp == WHITE_IS_ZERO) { // invert color value 
    18481837            samples[i*nSamples + ndx] = 
    1849               (byte) ((65535 - samples[i*nSamples + ndx]) & 0xffff); 
     1838              (byte) (255 - samples[i*nSamples + ndx]); 
    18501839          } 
    18511840          else if (photoInterp == CMYK) { 
     
    19031892 
    19041893          if (photoInterp == WHITE_IS_ZERO) { // invert color value 
    1905             long max = 1; 
    1906             for (int q=0; q<numBytes; q++) max *= 8; 
    1907             v = DataTools.bytesToShort(samples, i*nSamples + ndx*2, 2, 
    1908               littleEndian); 
     1894            long max = (long) Math.pow(2, numBytes * 8) - 1; 
    19091895            v = (short) (max - v); 
    19101896          } 
    19111897          else if (photoInterp == CMYK) { 
    1912             v = DataTools.bytesToShort(samples, i*nSamples + ndx*2, 2, 
    1913               littleEndian); 
    19141898            v = (short) (Integer.MAX_VALUE - v); 
    19151899          } 
  • trunk/loci/formats/in/GelReader.java

    r3772 r3886  
    2626 
    2727import java.io.*; 
     28import java.text.*; 
     29import java.util.Date; 
     30import java.util.Hashtable; 
    2831import loci.formats.*; 
    2932import loci.formats.meta.FilterMetadata; 
     
    5356  private static final int MD_FILE_UNITS = 33452; 
    5457 
     58  // Scaling options 
     59  private static final int SQUARE_ROOT = 2; 
     60  private static final int LINEAR = 128; 
     61 
     62 
    5563  // -- Constructor -- 
    5664 
     
    6068  } 
    6169 
     70  // -- IFormatReader API methods -- 
     71 
     72  /** 
     73   * @see loci.formats.IFormatReader#openBytes(int, byte[], int, int, int, int) 
     74   */ 
     75  public byte[] openBytes(int no, byte[] buf, int x, int y, int w, int h) 
     76    throws FormatException, IOException 
     77  { 
     78    boolean sqrt = TiffTools.getIFDLongValue(ifds[no], MD_FILETAG, 
     79      true, LINEAR) == SQUARE_ROOT; 
     80 
     81    if (sqrt) { 
     82      float scale = ((TiffRational) TiffTools.getIFDValue(ifds[no], 
     83        MD_SCALE_PIXEL)).floatValue(); 
     84 
     85      byte[] tmp = new byte[buf.length]; 
     86      super.openBytes(no, tmp, x, y, w, h); 
     87 
     88      int originalBytes = TiffTools.getBitsPerSample(ifds[no])[0] / 8; 
     89 
     90      for (int i=0; i<tmp.length/4; i++) { 
     91        long value = DataTools.bytesToShort(tmp, i*originalBytes, 
     92          originalBytes, core.littleEndian[0]); 
     93        long square = value * value; 
     94        float pixel = square * scale; 
     95        DataTools.unpackBytes(Float.floatToIntBits(pixel), buf, i*4, 4, 
     96          core.littleEndian[0]); 
     97      } 
     98    } 
     99    else super.openBytes(no, buf, x, y, w, h); 
     100 
     101    return buf; 
     102  } 
     103 
    62104  // -- Internal BaseTiffReader API methods -- 
    63105 
    64   /* @see loci.formats.BaseTiffReader#initStandardMetadata() */ 
    65   protected void initStandardMetadata() throws FormatException, IOException { 
    66     super.initStandardMetadata(); 
    67  
    68     core.imageCount[0]--; 
    69  
    70     try { 
    71       long fmt = TiffTools.getIFDLongValue(ifds[1], MD_FILETAG, true, 128); 
    72       addMeta("Data format", fmt == 2 ? "square root" : "linear"); 
    73     } 
    74     catch (FormatException exc) { 
    75       trace(exc); 
     106  /* @see BaseTiffReader#initMetadata() */ 
     107  protected void initMetadata() throws FormatException, IOException { 
     108    if (ifds.length > 1) { 
     109      Hashtable[] tmpIFDs = ifds; 
     110      ifds = new Hashtable[tmpIFDs.length / 2]; 
     111      for (int i=0; i<ifds.length; i++) { 
     112        ifds[i] = new Hashtable(); 
     113        ifds[i].putAll(tmpIFDs[i*2 + 1]); 
     114        ifds[i].putAll(tmpIFDs[i*2]); 
     115      } 
    76116    } 
    77117 
     118    super.initMetadata(); 
     119 
     120    long format = TiffTools.getIFDLongValue(ifds[0], MD_FILETAG, true, LINEAR); 
     121    if (format == SQUARE_ROOT) core.pixelType[0] = FormatTools.FLOAT; 
     122    addMeta("Data format", format == SQUARE_ROOT ? "square root" : "linear"); 
     123 
    78124    TiffRational scale = 
    79       (TiffRational) TiffTools.getIFDValue(ifds[1], MD_SCALE_PIXEL); 
     125      (TiffRational) TiffTools.getIFDValue(ifds[0], MD_SCALE_PIXEL); 
    80126    addMeta("Scale factor", scale == null ? new TiffRational(1, 1) : scale); 
    81127 
    82128    // ignore MD_COLOR_TABLE 
    83129 
    84     String lab = (String) TiffTools.getIFDValue(ifds[1], MD_LAB_NAME); 
    85     addMeta("Lab name", lab == null ? "unknown" : lab); 
     130    String lab = (String) TiffTools.getIFDValue(ifds[0], MD_LAB_NAME); 
     131    addMeta("Lab name", lab); 
    86132 
    87     String info = (String) TiffTools.getIFDValue(ifds[1], MD_SAMPLE_INFO); 
    88     addMeta("Sample info", info == null ? "unknown" : info); 
     133    String info = (String) TiffTools.getIFDValue(ifds[0], MD_SAMPLE_INFO); 
     134    addMeta("Sample info", info); 
    89135 
    90     String prepDate = (String) TiffTools.getIFDValue(ifds[1], MD_PREP_DATE); 
    91     addMeta("Date prepared", prepDate == null ? "unknown" : prepDate); 
     136    String prepDate = (String) TiffTools.getIFDValue(ifds[0], MD_PREP_DATE); 
     137    addMeta("Date prepared", prepDate); 
    92138 
    93     String prepTime = (String) TiffTools.getIFDValue(ifds[1], MD_PREP_TIME); 
    94     addMeta("Time prepared", prepTime == null ? "unknown" : prepTime); 
     139    String prepTime = (String) TiffTools.getIFDValue(ifds[0], MD_PREP_TIME); 
     140    addMeta("Time prepared", prepTime); 
    95141 
    96     String units = (String) TiffTools.getIFDValue(ifds[1], MD_FILE_UNITS); 
    97     addMeta("File units", units == null ? "unknown" : units); 
     142    String units = (String) TiffTools.getIFDValue(ifds[0], MD_FILE_UNITS); 
     143    addMeta("File units", units); 
    98144 
     145    core.imageCount[series] = ifds.length; 
    99146    core.sizeT[series] = core.imageCount[series]; 
    100147 
     
    102149      new FilterMetadata(getMetadataStore(), isMetadataFiltered()); 
    103150    store.setImageName("", 0); 
    104     store.setImageCreationDate( 
    105       DataTools.convertDate(System.currentTimeMillis(), DataTools.UNIX), 0); 
     151    store.setImageDescription(info, 0); 
     152 
     153    if (prepTime != null) { 
     154      SimpleDateFormat parse = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); 
     155      Date date = parse.parse(prepTime, new ParsePosition(0)); 
     156      SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
     157      store.setImageCreationDate(fmt.format(date), 0); 
     158    } 
     159    else { 
     160      store.setImageCreationDate( 
     161        DataTools.convertDate(System.currentTimeMillis(), DataTools.UNIX), 0); 
     162    } 
     163 
     164    MetadataTools.populatePixels(store, this); 
    106165    Float pixelSize = new Float(scale.floatValue()); 
    107166    store.setDimensionsPhysicalSizeX(pixelSize, 0, 0); 
Note: See TracChangeset for help on using the changeset viewer.