Changeset 4682


Ignore:
Timestamp:
12/09/08 16:13:44 (11 years ago)
Author:
melissa
Message:
  • Fixed bug with 16-bit RLE-compressed DICOM files.
  • Fixed JPEG-2000 speed issue.
Location:
trunk/components/bio-formats/src/loci/formats
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/src/loci/formats/codec/JPEG2000Codec.java

    r4681 r4682  
    248248    BufferedImage b = null; 
    249249    Exception exception = null; 
    250     //long fp = in.getFilePointer(); 
     250    long fp = in.getFilePointer(); 
    251251    try { 
    252       //if (maxFP == 0) maxFP = in.length(); 
    253       //byte[] buf = new byte[(int) (maxFP - fp)]; 
    254       //in.read(buf); 
    255  
    256       //ByteArrayInputStream bis = new ByteArrayInputStream(buf); 
    257       //MemoryCacheImageInputStream mciis = new MemoryCacheImageInputStream(bis); 
    258       MemoryCacheImageInputStream mciis = new MemoryCacheImageInputStream(in); 
     252      byte[] buf = null; 
     253      if (options.maxBytes == 0) { 
     254        buf = new byte[(int) (in.length() - fp)]; 
     255      } 
     256      else buf = new byte[(int) (options.maxBytes - fp)]; 
     257      in.read(buf); 
     258 
     259      ByteArrayInputStream bis = new ByteArrayInputStream(buf); 
     260      MemoryCacheImageInputStream mciis = new MemoryCacheImageInputStream(bis); 
    259261 
    260262      r.setVar("mciis", mciis); 
     
    264266      single = AWTImageTools.getPixelBytes(b, options.littleEndian); 
    265267 
    266       //bis.close(); 
     268      bis.close(); 
    267269      mciis.close(); 
    268       //buf = null; 
     270      buf = null; 
    269271      b = null; 
    270272    } 
  • trunk/components/bio-formats/src/loci/formats/codec/PackbitsCodec.java

    r4681 r4682  
    2424package loci.formats.codec; 
    2525 
     26import java.io.ByteArrayOutputStream; 
    2627import java.io.IOException; 
    2728import loci.common.RandomAccessStream; 
     
    5859  { 
    5960    // Adapted from the TIFF 6.0 specification, page 42. 
    60     ByteVector output = new ByteVector(1024); 
     61    ByteArrayOutputStream output = new ByteArrayOutputStream(1024); 
    6162    while (output.size() < options.maxBytes && 
    6263      in.getFilePointer() < in.length()) 
     
    6667        byte[] b = new byte[n + 1]; 
    6768        in.read(b); 
    68         output.add(b); 
     69        output.write(b); 
    6970        b = null; 
    7071      } 
     
    7273        int len = -n + 1; 
    7374        byte inp = in.readByte(); 
    74         for (int i=0; i<len; i++) output.add(inp); 
     75        for (int i=0; i<len; i++) output.write(inp); 
    7576      } 
    7677    } 
  • trunk/components/bio-formats/src/loci/formats/in/DicomReader.java

    r4681 r4682  
    145145    if (getPixelType() != FormatTools.INT8 && 
    146146      getPixelType() != FormatTools.UINT8) 
    147    { 
     147    { 
    148148      return null; 
    149    } 
    150    return lut; 
     149    } 
     150    return lut; 
    151151  } 
    152152 
     
    180180      // plane is compressed using run-length encoding 
    181181      CodecOptions options = new CodecOptions(); 
    182       options.maxBytes = bytes / ec; 
     182      options.maxBytes = getSizeX() * getSizeY(); 
    183183      for (int c=0; c<ec; c++) { 
    184184        PackbitsCodec codec = new PackbitsCodec(); 
    185         byte[] t = codec.decompress(in, options); 
    186         if (t.length < (bytes / ec)) { 
    187           byte[] tmp = t; 
    188           t = new byte[bytes / ec]; 
    189           System.arraycopy(tmp, 0, t, 0, tmp.length); 
    190         } 
     185        byte[] t = null; 
    191186 
    192187        if (bpp > 1) { 
    193188          int plane = bytes / (bpp * ec); 
    194           byte[][] tmp = new byte[bpp][plane]; 
     189          byte[][] tmp = new byte[bpp][]; 
    195190          for (int i=0; i<bpp; i++) { 
    196             System.arraycopy(t, i*plane, tmp[i], 0, plane); 
     191            tmp[i] = codec.decompress(in, options); 
     192            if (no < getImageCount() - 1 || i < bpp - 1) { 
     193              while (in.read() == 0); 
     194              in.seek(in.getFilePointer() - 1); 
     195            } 
    197196          } 
     197          t = new byte[bytes / ec]; 
    198198          for (int i=0; i<plane; i++) { 
    199199            for (int j=0; j<bpp; j++) { 
    200               t[i*bpp + j] = isLittleEndian() ? tmp[bpp - j - 1][i] : tmp[j][i]; 
     200              int byteIndex = isLittleEndian() ? bpp - j - 1 : j; 
     201              if (i < tmp[byteIndex].length) { 
     202                t[i * bpp + j] = tmp[byteIndex][i]; 
     203              } 
    201204            } 
     205          } 
     206        } 
     207        else { 
     208          t = codec.decompress(in, options); 
     209          if (t.length < (bytes / ec)) { 
     210            byte[] tmp = t; 
     211            t = new byte[bytes / ec]; 
     212            System.arraycopy(tmp, 0, t, 0, tmp.length); 
     213          } 
     214          if (no < getImageCount() - 1 || c < ec - 1) { 
     215            while (in.read() == 0); 
     216            in.seek(in.getFilePointer() - 1); 
    202217          } 
    203218        } 
     
    215230          System.arraycopy(t, src, buf, dest, len); 
    216231        } 
    217  
    218         while (in.read() == 0); 
    219         in.seek(in.getFilePointer() - 1); 
    220232      } 
    221233    } 
     
    442454          break; 
    443455        case PIXEL_DATA: 
    444         case 0xfffee000: 
     456        case ITEM: 
    445457          if (elementLength != 0) { 
    446458            baseOffset = in.getFilePointer(); 
     
    485497    } 
    486498 
    487     int plane = getSizeX() * getSizeY() * (lut == null ? getSizeC() : 1) * 
    488       FormatTools.getBytesPerPixel(getPixelType()); 
     499    int bpp = FormatTools.getBytesPerPixel(getPixelType()); 
     500    int plane = getSizeX() * getSizeY() * (lut == null ? getSizeC() : 1) * bpp; 
    489501 
    490502    status("Calculating image offsets"); 
     
    499511          in.seek(offsets[i - 1]); 
    500512          CodecOptions options = new CodecOptions(); 
    501           options.maxBytes = plane; 
    502           new PackbitsCodec().decompress(in, options); 
     513          options.maxBytes = plane / bpp; 
     514          for (int q=0; q<bpp; q++) { 
     515            new PackbitsCodec().decompress(in, options); 
     516            while (in.read() == 0); 
     517            in.seek(in.getFilePointer() - 1); 
     518          } 
    503519        } 
    504520        in.skipBytes(i == 0 ? 64 : 53); 
Note: See TracChangeset for help on using the changeset viewer.