Changeset 4204


Ignore:
Timestamp:
07/17/08 10:24:38 (12 years ago)
Author:
melissa
Message:

Changed Util.openProcessor methods to Util.openProcessors. These methods return an array of ImageProcessors (one per RGB channel), and do not assume that the IFormatReader parameter is a ChannelSeparator.
Closes #290.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/plugins/CustomStack.java

    r4055 r4204  
    7676    try { 
    7777      int index = FormatTools.getReorderedIndex(reader, stackOrder, n - 1); 
    78       if (merge <= 1) return Util.openProcessor(reader, index); 
     78      if (merge <= 1) return Util.openProcessors(reader, index)[0]; 
    7979      else { 
    8080        ImageProcessor[] p = new ImageProcessor[merge]; 
    8181        int[] zct = FormatTools.getZCTCoords(reader, index * merge); 
    8282        for (int q=0; q<merge; q++) { 
    83           p[q] = Util.openProcessor(reader, FormatTools.getIndex(reader, 
    84             zct[0], zct[1] + q, zct[2])); 
     83          p[q] = Util.openProcessors(reader, FormatTools.getIndex(reader, 
     84            zct[0], zct[1] + q, zct[2]))[0]; 
    8585        } 
    8686        return Util.makeRGB(p).getProcessor(); 
  • trunk/loci/plugins/ImageProcessorSource.java

    r4055 r4204  
    5757    ImageProcessor ip = null; 
    5858    try { 
    59       ip = Util.openProcessor(reader, index); 
     59      ip = Util.openProcessors(reader, index)[0]; 
    6060    } 
    6161    catch (FormatException exc) { 
  • trunk/loci/plugins/Importer.java

    r4198 r4204  
    471471 
    472472            // get image processor for jth plane 
    473             ImageProcessor ip = Util.openProcessor(r, ndx, cropOptions[i]); 
     473            ImageProcessor ip = Util.openProcessors(r, ndx, cropOptions[i])[0]; 
    474474            if (ip == null) { 
    475475              plugin.canceled = true; 
  • trunk/loci/plugins/LociFunctions.java

    r4081 r4204  
    2727 
    2828import ij.IJ; 
    29 import ij.ImagePlus; 
    3029import ij.process.ImageProcessor; 
    3130import java.awt.Rectangle; 
     
    130129    throws FormatException, IOException 
    131130  { 
    132     ImageProcessor ip = Util.openProcessor(r, no.intValue()); 
    133     new ImagePlus(title, ip).show(); 
     131    ImageProcessor[] ip = Util.openProcessors(r, no.intValue()); 
     132    Util.makeRGB(title, ip).show(); 
    134133  } 
    135134 
     
    139138    Rectangle crop = new Rectangle(x.intValue(), y.intValue(), 
    140139      width.intValue(), height.intValue()); 
    141     ImageProcessor ip = Util.openProcessor(r, no.intValue(), crop); 
    142     new ImagePlus(title, ip).show(); 
     140    ImageProcessor[] ip = Util.openProcessors(r, no.intValue(), crop); 
     141    Util.makeRGB(title, ip).show(); 
    143142  } 
    144143 
  • trunk/loci/plugins/LociUploader.java

    r4055 r4204  
    2626package loci.plugins; 
    2727 
    28 import java.awt.TextField; 
    2928import ij.*; 
    3029import ij.gui.GenericDialog; 
     
    3231import ij.process.ColorProcessor; 
    3332import ij.io.FileInfo; 
     33import java.awt.TextField; 
    3434import java.util.HashSet; 
     35import loci.formats.DataTools; 
    3536import loci.formats.FormatTools; 
    3637import loci.formats.MetadataTools; 
     
    169170          toUpload = new byte[s.length * 2]; 
    170171          for (int j=0; j<s.length; j++) { 
    171             toUpload[j*2] = little ? (byte) (s[j] & 0xff) : 
    172               (byte) ((s[j] >>> 8) & 0xff); 
    173             toUpload[j*2 + 1] = little ? (byte) ((s[j] >>> 8) & 0xff): 
    174               (byte) (s[j] & 0xff); 
     172            DataTools.unpackShort(s[j], toUpload, j * 2, little); 
    175173          } 
    176174        } 
     
    191189            toUpload = new byte[4 * p.length]; 
    192190            for (int j=0; j<p.length; j++) { 
    193               toUpload[j*4] = little ? (byte) (p[j] & 0xff) : 
    194                 (byte) ((p[j] >> 24) & 0xff); 
    195               toUpload[j*4 + 1] = little ? (byte) ((p[j] >> 8) & 0xff) : 
    196                 (byte) ((p[j] >> 16) & 0xff); 
    197               toUpload[j*4 + 2] = little ? (byte) ((p[j] >> 16) & 0xff) : 
    198                 (byte) ((p[j] >> 8) & 0xff); 
    199               toUpload[j*4 + 3] = little ? (byte) ((p[j] >> 24) & 0xff) : 
    200                 (byte) (p[j] & 0xff); 
     191              DataTools.unpackBytes(p[j], toUpload, j * 4, 4, little); 
    201192            } 
    202193          } 
     
    207198          for (int j=0; j<f.length; j++) { 
    208199            int k = Float.floatToIntBits(f[j]); 
    209             toUpload[j*4] = little ? (byte) (k & 0xff) : 
    210               (byte) ((k >> 24) & 0xff); 
    211             toUpload[j*4 + 1] = little ? (byte) ((k >> 8) & 0xff) : 
    212               (byte) ((k >> 16) & 0xff); 
    213             toUpload[j*4 + 2] = little ? (byte) ((k >> 16) & 0xff) : 
    214               (byte) ((k >> 8) & 0xff); 
    215             toUpload[j*4 + 3] = little ? (byte) ((k >> 24) & 0xff) : 
    216               (byte) (k & 0xff); 
     200            DataTools.unpackBytes(k, toUpload, j * 4, 4, little); 
    217201          } 
    218202        } 
  • trunk/loci/plugins/Util.java

    r4189 r4204  
    7272   * @param no Position of image plane. 
    7373   */ 
    74   public static ImageProcessor openProcessor(IFormatReader r, int no) 
     74  public static ImageProcessor[] openProcessors(IFormatReader r, int no) 
    7575    throws FormatException, IOException 
    7676  { 
    77     return openProcessor(r, no, null); 
    78   } 
    79  
    80   /** 
    81    * Creates an ImageJ image processor object using the given format reader 
    82    * for the image plane at the given position. 
     77    return openProcessors(r, no, null); 
     78  } 
     79 
     80  /** 
     81   * Returns an array of ImageProcessors that represent the given slice. 
     82   * There is one ImageProcessor per RGB channel, i.e. 
     83   * length of returned array == r.getRGBChannelCount(). 
    8384   * 
    8485   * @param r Format reader to use for reading the data. 
     
    8788   *   is to be done. 
    8889   */ 
    89   public static ImageProcessor openProcessor(IFormatReader r, int no, 
     90  public static ImageProcessor[] openProcessors(IFormatReader r, int no, 
    9091    Rectangle crop) throws FormatException, IOException 
    9192  { 
     
    9394    byte[] b = null; 
    9495    boolean first = true; 
    95     boolean doCrop = crop != null; 
     96    if (crop == null) crop = new Rectangle(0, 0, r.getSizeX(), r.getSizeY()); 
    9697    while (true) { 
    9798      // read LuraWave license code, if available 
     
    101102      } 
    102103      try { 
    103         if (doCrop) { 
    104           b = r.openBytes(no, crop.x, crop.y, crop.width, crop.height); 
    105         } 
    106         else b = r.openBytes(no); 
     104        b = r.openBytes(no, crop.x, crop.y, crop.width, crop.height); 
    107105        break; 
    108106      } 
     
    126124    } 
    127125 
    128     int w = doCrop ? crop.width : r.getSizeX(); 
    129     int h = doCrop ? crop.height : r.getSizeY(); 
     126    int w = crop.width; 
     127    int h = crop.height; 
    130128    int c = r.getRGBChannelCount(); 
    131129    int type = r.getPixelType(); 
    132130    int bpp = FormatTools.getBytesPerPixel(type); 
     131    boolean interleave = r.isInterleaved(); 
    133132 
    134133    boolean isSigned = type == FormatTools.INT8 || 
     
    139138      // a different size, but we have no way of knowing what size; 
    140139      // so open this plane as a BufferedImage to find out 
    141       BufferedImage bi = doCrop ? 
    142         r.openImage(no, crop.x, crop.y, crop.width, crop.height) : 
    143         r.openImage(no); 
     140      BufferedImage bi = 
     141        r.openImage(no, crop.x, crop.y, crop.width, crop.height); 
    144142      b = ImageTools.padImage(b, r.isInterleaved(), c, 
    145143        bi.getWidth() * bpp, w, h); 
     
    149147    boolean isFloat = type == FormatTools.FLOAT || type == FormatTools.DOUBLE; 
    150148    boolean isLittle = r.isLittleEndian(); 
    151     Object pixels = DataTools.makeDataArray(b, bpp, isFloat, isLittle); 
    152149 
    153150    IndexColorModel cm = null; 
     
    159156          byteTable[1], byteTable[2]); 
    160157      } 
    161       //else { 
    162       //  short[][] shortTable = r.get16BitLookupTable(); 
    163       //  model = new Index16ColorModel(16, shortTable[0].length, shortTable); 
    164       //} 
    165     } 
    166  
    167     // construct image processor 
    168     ImageProcessor ip = null; 
    169     if (pixels instanceof byte[]) { 
    170       byte[] q = (byte[]) pixels; 
    171       if (q.length > w * h) { 
    172         byte[] tmp = q; 
    173         q = new byte[w * h]; 
    174         System.arraycopy(tmp, 0, q, 0, q.length); 
    175       } 
    176  
    177       if (isSigned) q = DataTools.makeSigned(q); 
    178  
    179       ip = new ByteProcessor(w, h, q, null); 
    180       if (cm != null) ip.setColorModel(cm); 
    181     } 
    182     else if (pixels instanceof short[]) { 
    183       short[] q = (short[]) pixels; 
    184       if (q.length > w * h) { 
    185         short[] tmp = q; 
    186         q = new short[w * h]; 
    187         System.arraycopy(tmp, 0, q, 0, q.length); 
    188       } 
    189  
    190       if (isSigned) q = DataTools.makeSigned(q); 
    191  
    192       ip = new ShortProcessor(w, h, q, model); 
    193     } 
    194     else if (pixels instanceof int[]) { 
    195       int[] q = (int[]) pixels; 
    196       if (q.length > w * h) { 
    197         int[] tmp = q; 
    198         q = new int[w * h]; 
    199         System.arraycopy(tmp, 0, q, 0, q.length); 
    200       } 
    201  
    202       if (isSigned) q = DataTools.makeSigned(q); 
    203  
    204       ip = new FloatProcessor(w, h, q); 
    205     } 
    206     else if (pixels instanceof float[]) { 
    207       float[] q = (float[]) pixels; 
    208       if (q.length > w * h) { 
    209         float[] tmp = q; 
    210         q = new float[w * h]; 
    211         System.arraycopy(tmp, 0, q, 0, q.length); 
    212       } 
    213       if (c == 1) { 
    214         // single channel -- use normal float processor 
    215         ip = new FloatProcessor(w, h, q, null); 
    216       } 
    217       else { 
    218         // multiple channels -- convert floats to color processor 
    219         float[][] pix = new float[c][w * h]; 
    220         if (!r.isInterleaved()) { 
    221           for (int i=0; i<q.length; i+=c) { 
    222             for (int j=0; j<c; j++) pix[j][i / c] = q[i + j]; 
    223           } 
    224         } 
    225         else { 
    226           for (int i=0; i<c; i++) { 
    227             System.arraycopy(q, i * pix[i].length, pix[i], 0, pix[i].length); 
    228           } 
    229         } 
    230         byte[][] bytes = new byte[c][w * h]; 
    231         for (int i=0; i<c; i++) { 
    232           ip = new FloatProcessor(w, h, pix[i], null); 
    233           ip = ip.convertToByte(true); 
    234           bytes[i] = (byte[]) ip.getPixels(); 
    235         } 
    236         ip = new ColorProcessor(w, h); 
    237         ((ColorProcessor) ip).setRGB(bytes[0], bytes[1], 
    238           pix.length >= 3 ? bytes[2] : new byte[w * h]); 
    239       } 
    240     } 
    241     else if (pixels instanceof double[]) { 
    242       double[] q = (double[]) pixels; 
    243       if (q.length > w * h) { 
    244         double[] tmp = q; 
    245         q = new double[w * h]; 
    246         System.arraycopy(tmp, 0, q, 0, q.length); 
    247       } 
    248       ip = new FloatProcessor(w, h, q); 
     158    } 
     159 
     160    // construct image processors 
     161    ImageProcessor[] ip = new ImageProcessor[c]; 
     162    for (int i=0; i<c; i++) { 
     163      byte[] channel = 
     164        ImageTools.splitChannels(b, i, c, bpp, false, interleave); 
     165      Object pixels = DataTools.makeDataArray(channel, bpp, isFloat, isLittle); 
     166      if (pixels instanceof byte[]) { 
     167        byte[] q = (byte[]) pixels; 
     168        if (q.length > w * h) { 
     169          byte[] tmp = q; 
     170          q = new byte[w * h]; 
     171          System.arraycopy(tmp, 0, q, 0, q.length); 
     172        } 
     173 
     174        if (isSigned) q = DataTools.makeSigned(q); 
     175 
     176        ip[i] = new ByteProcessor(w, h, q, null); 
     177        if (cm != null) ip[i].setColorModel(cm); 
     178      } 
     179      else if (pixels instanceof short[]) { 
     180        short[] q = (short[]) pixels; 
     181        if (q.length > w * h) { 
     182          short[] tmp = q; 
     183          q = new short[w * h]; 
     184          System.arraycopy(tmp, 0, q, 0, q.length); 
     185        } 
     186 
     187        if (isSigned) q = DataTools.makeSigned(q); 
     188 
     189        ip[i] = new ShortProcessor(w, h, q, model); 
     190      } 
     191      else if (pixels instanceof int[]) { 
     192        int[] q = (int[]) pixels; 
     193        if (q.length > w * h) { 
     194          int[] tmp = q; 
     195          q = new int[w * h]; 
     196          System.arraycopy(tmp, 0, q, 0, q.length); 
     197        } 
     198 
     199        if (isSigned) q = DataTools.makeSigned(q); 
     200 
     201        ip[i] = new FloatProcessor(w, h, q); 
     202      } 
     203      else if (pixels instanceof float[]) { 
     204        float[] q = (float[]) pixels; 
     205        if (q.length > w * h) { 
     206          float[] tmp = q; 
     207          q = new float[w * h]; 
     208          System.arraycopy(tmp, 0, q, 0, q.length); 
     209        } 
     210        ip[i] = new FloatProcessor(w, h, q, null); 
     211      } 
     212      else if (pixels instanceof double[]) { 
     213        double[] q = (double[]) pixels; 
     214        if (q.length > w * h) { 
     215          double[] tmp = q; 
     216          q = new double[w * h]; 
     217          System.arraycopy(tmp, 0, q, 0, q.length); 
     218        } 
     219        ip[i] = new FloatProcessor(w, h, q); 
     220      } 
    249221    } 
    250222 
     
    257229   */ 
    258230  public static ImagePlus makeRGB(ImageProcessor[] p) { 
    259     if (p.length == 1) return new ImagePlus("", p[0]); 
     231    return makeRGB("", p); 
     232  } 
     233 
     234  /** 
     235   * Converts the given array of ImageProcessors into a single-slice 
     236   * RGB ImagePlus. 
     237   */ 
     238  public static ImagePlus makeRGB(String title, ImageProcessor[] p) { 
     239    if (p.length == 1) return new ImagePlus(title, p[0]); 
    260240 
    261241    // check that all processors are of the same type and size 
     
    294274      cp.setRGB(bytes[0], bytes[1], bytes.length == 3 ? bytes[2] : 
    295275        new byte[width * height]); 
    296       imp = new ImagePlus("", cp); 
     276      imp = new ImagePlus(title, cp); 
    297277    } 
    298278    else if (p.length <= 7 && Util.checkVersion("1.39l", COMPOSITE_MSG)) { 
     
    304284        ReflectedUniverse r = new ReflectedUniverse(); 
    305285        r.exec("import ij.CompositeImage"); 
    306         ImagePlus ii = new ImagePlus("", tmpStack); 
     286        ImagePlus ii = new ImagePlus(title, tmpStack); 
    307287        r.setVar("ii", ii); 
    308288        r.exec("imp = new CompositeImage(ii, CompositeImage.COMPOSITE)"); 
  • trunk/utils/Read_Image.java

    r4011 r4204  
    3232      for (int i=0; i<num; i++) { 
    3333        IJ.showStatus("Reading image plane #" + (i + 1) + "/" + num); 
    34         ImageProcessor ip = Util.openProcessor(r, i); 
     34        ImageProcessor ip = Util.openProcessors(r, i)[0]; 
    3535        stack.addSlice("" + (i + 1), ip); 
    3636      } 
Note: See TracChangeset for help on using the changeset viewer.