Changeset 7042


Ignore:
Timestamp:
10/07/10 15:09:59 (9 years ago)
Author:
melissa
Message:

Parse and apply channel colors stored in ND2 files.

Location:
trunk/components/bio-formats/src/loci/formats/in
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/src/loci/formats/in/ND2Handler.java

    r6965 r7042  
    9393  private String date; 
    9494 
     95  private Hashtable<String, Integer> colors = new Hashtable<String, Integer>(); 
     96  private Hashtable<String, String> dyes = new Hashtable<String, String>(); 
     97  private Hashtable<String, Integer> realColors = 
     98    new Hashtable<String, Integer>(); 
     99 
    95100  // -- Constructor -- 
    96101 
     
    284289  } 
    285290 
     291  public Hashtable<String, Integer> getChannelColors() { 
     292    return realColors; 
     293  } 
     294 
    286295  // -- DefaultHandler API methods -- 
    287296 
     
    370379      metadata.put("Pinhole size", value); 
    371380    } 
     381    else if (qName.endsWith("ChannelColor")) { 
     382      String name = qName.substring(0, qName.indexOf("Channel")); 
     383      colors.put(name, new Integer(value)); 
     384    } 
     385    else if (qName.endsWith("DyeName")) { 
     386      dyes.put(qName.substring(0, qName.indexOf("Channel")), value); 
     387    } 
    372388    else { 
    373389      StringBuffer sb = new StringBuffer(); 
     
    381397 
    382398    prevRuntype = attributes.getValue("runtype"); 
     399  } 
     400 
     401  public void endDocument() { 
     402    for (String name : colors.keySet()) { 
     403      String chName = dyes.get(name); 
     404      if (chName == null) chName = name; 
     405      realColors.put(chName, colors.get(name)); 
     406    } 
    383407  } 
    384408 
  • trunk/components/bio-formats/src/loci/formats/in/NativeND2Reader.java

    r6881 r7042  
    3636import loci.formats.FormatReader; 
    3737import loci.formats.FormatTools; 
     38import loci.formats.ImageTools; 
    3839import loci.formats.MetadataTools; 
    3940import loci.formats.codec.Codec; 
     
    9192  private ArrayList<Double> posZ; 
    9293 
     94  private Hashtable<String, Integer> channelColors; 
     95  private boolean split = false; 
     96  private int lastChannel; 
     97  private int[] colors; 
     98 
    9399  // -- Constructor -- 
    94100 
     
    111117  } 
    112118 
     119  /* @see loci.formats.IFormatReader#get8BitLookupTable() */ 
     120  public byte[][] get8BitLookupTable() { 
     121    if (FormatTools.getBytesPerPixel(getPixelType()) != 1 || 
     122      !isIndexed() || lastChannel < 0 || lastChannel >= colors.length) 
     123    { 
     124      return null; 
     125    } 
     126 
     127    int color = colors[lastChannel]; 
     128    byte[][] lut = new byte[3][256]; 
     129 
     130    int index = -1; 
     131    if (color > 0 && color < 256) index = 0; 
     132    else if (color >= 256 && color < 65280) index = 1; 
     133    else if (color > 65280 && color <= 16711680) index = 2; 
     134 
     135    for (int i=0; i<256; i++) { 
     136      if (index == -1) { 
     137        lut[0][i] = (byte) i; 
     138        lut[1][i] = (byte) i; 
     139        lut[2][i] = (byte) i; 
     140      } 
     141      else { 
     142        lut[index][i] = (byte) i; 
     143      } 
     144    } 
     145 
     146    return lut; 
     147  } 
     148 
     149  /* @see loci.formats.IFormatReader#get16BitLookupTable() */ 
     150  public short[][] get16BitLookupTable() { 
     151    if (FormatTools.getBytesPerPixel(getPixelType()) != 2 || 
     152      !isIndexed() || lastChannel < 0 || lastChannel >= colors.length) 
     153    { 
     154      return null; 
     155    } 
     156 
     157    int color = colors[lastChannel]; 
     158    short[][] lut = new short[3][65536]; 
     159 
     160    int index = -1; 
     161    if (color > 0 && color < 256) index = 0; 
     162    else if (color >= 256 && color <= 65280) index = 1; 
     163    else if (color > 65280 && color <= 16711680) index = 2; 
     164 
     165    for (int i=0; i<65536; i++) { 
     166      if (index == -1) { 
     167        lut[0][i] = (short) i; 
     168        lut[1][i] = (short) i; 
     169        lut[2][i] = (short) i; 
     170      } 
     171      else { 
     172        lut[index][i] = (short) i; 
     173      } 
     174    } 
     175 
     176    return lut; 
     177  } 
     178 
    113179  /** 
    114180   * @see loci.formats.IFormatReader#openBytes(int, byte[], int, int, int, int) 
     
    119185    FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h); 
    120186 
    121     in.seek(offsets[series][no]); 
     187    lastChannel = split ? no % getSizeC() : 0; 
     188    int planeIndex = split ? no / getSizeC() : no; 
     189    in.seek(offsets[series][planeIndex]); 
    122190 
    123191    int bpp = FormatTools.getBytesPerPixel(getPixelType()); 
    124192    int pixel = bpp * getRGBChannelCount(); 
    125  
    126     long maxFP = no == getImageCount() - 1 ? 
    127       in.length() : offsets[series][no + 1]; 
     193    if (split) pixel *= getSizeC(); 
     194 
     195    int totalPlanes = split ? getImageCount() / getSizeC() : getImageCount(); 
     196 
     197    long maxFP = planeIndex == totalPlanes - 1 ? 
     198      in.length() : offsets[series][planeIndex + 1]; 
    128199 
    129200    CodecOptions options = new CodecOptions(); 
     
    137208      if (codec == null) codec = createCodec(isJPEG); 
    138209      byte[] t = codec.decompress(in, options); 
     210      byte[] pix = new byte[(buf.length / bpp) * pixel]; 
    139211      int effectiveX = getSizeX() + scanlinePad; 
    140212      for (int row=0; row<h; row++) { 
    141213        int offset = (row + y) * effectiveX * pixel + x * pixel; 
    142214        if (offset + w * pixel <= t.length) { 
    143           System.arraycopy(t, offset, buf, row * w * pixel, w * pixel); 
     215          System.arraycopy(t, offset, pix, row * w * pixel, w * pixel); 
    144216        } 
    145217      } 
    146218      t = null; 
     219 
     220      copyPixels(x, y, w, h, bpp, scanlinePad, pix, buf); 
     221    } 
     222    else if (split) { 
     223      byte[] pix = new byte[(getSizeX() + scanlinePad) * getSizeY() * pixel]; 
     224      in.read(pix); 
     225      copyPixels(x, y, w, h, bpp, scanlinePad, pix, buf); 
     226      pix = null; 
    147227    } 
    148228    else { 
     
    166246      xOffset = yOffset = zOffset = 0; 
    167247      posX = posY = posZ = null; 
     248      channelColors = null; 
     249      split = false; 
    168250    } 
    169251  } 
     
    176258 
    177259    in = new RandomAccessInputStream(id); 
     260 
     261    channelColors = new Hashtable<String, Integer>(); 
    178262 
    179263    if (in.read() == -38 && in.read() == -50) { 
     
    249333          name = name.delete(0, name.length()); 
    250334        } 
    251         else if (blockType.startsWith("Image")) { 
     335        else if (blockType.startsWith("Image") || 
     336          blockType.startsWith("CustomDataVa")) 
     337        { 
    252338          int length = lenOne + lenTwo - 12; 
    253339          byte[] b = new byte[length]; 
     
    311397      XMLTools.parseXML(xmlString, handler); 
    312398 
     399      channelColors = handler.getChannelColors(); 
    313400      isLossless = handler.isLossless(); 
    314401      fieldIndex = handler.getFieldIndex(); 
     
    494581      } 
    495582 
     583      split = getSizeC() > 1; 
    496584      for (int i=0; i<getSeriesCount(); i++) { 
    497         core[i].rgb = getSizeC() > 1; 
     585        core[i].rgb = false; 
    498586        core[i].littleEndian = true; 
    499         core[i].interleaved = true; 
    500         core[i].indexed = false; 
    501         core[i].falseColor = false; 
     587        core[i].interleaved = false; 
     588        core[i].indexed = channelColors.size() > 0; 
     589        core[i].falseColor = true; 
    502590        core[i].metadataComplete = true; 
    503         core[i].imageCount = core[i].sizeZ * core[i].sizeT; 
    504         if (!core[i].rgb) core[i].imageCount *= core[i].sizeC; 
     591        core[i].imageCount = core[i].sizeZ * core[i].sizeT * core[i].sizeC; 
    505592      } 
    506593 
     
    901988    ArrayList<Hashtable<String, String>> rois = handler.getROIs(); 
    902989 
     990    colors = new int[getEffectiveSizeC()]; 
     991 
    903992    for (int i=0; i<getSeriesCount(); i++) { 
    904993      for (int c=0; c<getEffectiveSizeC(); c++) { 
     
    909998        } 
    910999        if (index < channelNames.size()) { 
    911           store.setChannelName(channelNames.get(index), i, c); 
     1000          String channelName = channelNames.get(index); 
     1001          store.setChannelName(channelName, i, c); 
     1002 
     1003          Integer channelColor = channelColors.get(channelName); 
     1004          colors[c] = channelColor == null ? 0 : channelColor.intValue(); 
    9121005        } 
    9131006        if (index < modality.size()) { 
     
    9961089  } 
    9971090 
     1091  private void copyPixels(int x, int y, int w, int h, int bpp, int scanlinePad, 
     1092    byte[] pix, byte[] buf) 
     1093    throws IOException 
     1094  { 
     1095    pix = ImageTools.splitChannels(pix, lastChannel, getEffectiveSizeC(), bpp, 
     1096      false, true); 
     1097    RandomAccessInputStream s = new RandomAccessInputStream(pix); 
     1098    readPlane(s, x, y, w, h, scanlinePad, buf); 
     1099    s.close(); 
     1100  } 
     1101 
    9981102} 
Note: See TracChangeset for help on using the changeset viewer.